forum.bitel.ru
http://forum.bitel.ru/

Кодировка с Базе данных
http://forum.bitel.ru/viewtopic.php?f=14&t=12176
Страница 1 из 1

Автор:  Cobra57 [ 21 дек 2016, 16:03 ]
Заголовок сообщения:  Кодировка с Базе данных

Салют!
Есть необходимость извлекать данные по Счетам-фактурам прямо из БД которая храниться там в XMLке.
Неожиданно столкнулись с проблемой - XML хранятся в разно кодировке, при этом Биллинг нормально все отображает, а настроек никаких таких нет.
Возможно это исправить?

Например. Беру БД MySQL таблицу bill_invoice_data_14, она в кодировке 1251. Поле XML содержит данные в кодировке UTF-8:
Код:
<?xml version="1.0" encoding="windows-1251"?><data><bill amounts="600.00" balance_mode="1" bill_number="Б019904" charges="0.00" cid="4243" contract="0815-1027И" contract_date1="24.08.2015" contract_date2="" correction="0" date="30.11.2016" fc="0" mm="11" month="ноябрь" npid="11" payDoc="32120 от 28.07.16 г.; 249327 от 29.06.16 г.; " payDocDate=" " payer="Моисеева Наталья Витальевна (600)  подписать договор ответ хран     радиодоступ Дубрав" payments="600.00"


Беру тоже самое для другого типа СФ этого же модуля:
Код:
<?xml version="1.0" encoding="UTF-8"?><data><bill saldo="-12.66" saldo_prev="-57.33" amounts="12.66" payments="57.33" charges="0.00" cid="3194" type="11" type_title="ТТК СФ&amp;АКТ" contract="DA000287#0714-041T" contract_date1="25.07.2014" contract_date2="" fc="1" balance_mode="0" yy="2016" mm="11" month="ноябрь" period_date1="01.11.2016" period_date2="30.11.2016" date="30.11.2016" bill_number="DA000287#00703" payer="ООО «ГОРОДИЩЕ-ХЛЕБ»" total_sum="12.66" npid="12" correction="0"><pos position_id="2" name="Услуги междугородной телефонной связи за ноябрь 2016г." summ="12.66" sumUnscaled="12.66000" unit="-" unitCode="796" quantity="1" qtynums="0" qtynumsRnd="4" insum="1" awlz="0"></pos><tariff_bill><tariff tpid="88"


т.е здесь текст находиться в кодировке 1251, но кривой... перекодируя его в UTF-8 - Получаю нормальный результат.

Очень странно это...

Версия биллинга:
Код:
Клиент: вер. 7.0.853 / 10.11.2016 16:29:14
    os: Windows 7; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_51
  Сервер: вер. 7.0.1151 / 11.11.2016 20:51:59
    os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_102

  bill: вер. 7.0.107 / 10.11.2016 16:31:13
  card: вер. 7.0.40 / 22.08.2016 16:40:03
  dba: вер. 7.0.167 / 08.04.2016 17:40:39
  dialup: вер. 7.0.319 / 29.08.2016 16:38:40
  email: вер. 7.0.180 / 25.05.2016 13:53:19
  inet: вер. 7.0.702 / 10.11.2016 16:23:44
  ipn: вер. 7.0.260 / 24.10.2016 18:05:11
  mps: вер. 7.0.205 / 10.11.2016 16:31:26
  npay: вер. 7.0.199 / 05.10.2016 13:38:35
  phone: вер. 7.0.280 / 24.10.2016 18:05:25
  reports: вер. 7.0.223 / 27.10.2016 17:10:35
  robokassa: вер. 7.0.28 / 07.10.2016 16:47:02
  rscm: вер. 7.0.183 / 10.11.2016 16:31:29
  ru.bitel.bgbilling.plugins.cladr: вер. 7.0.123 / 08.04.2016 17:52:32
  ru.bitel.bgbilling.plugins.crm: вер. 7.0.198 / 07.11.2016 18:45:32
  ru.bitel.bgbilling.plugins.dispatch: вер. 7.0.89 / 17.10.2016 15:38:03
  ru.bitel.bgbilling.plugins.documents: вер. 7.0.175 / 05.10.2016 13:42:40
  ru.bitel.bgbilling.plugins.helpdesk: вер. 7.0.193 / 08.11.2016 16:07:52
  rurupay: вер. 7.0.37 / 05.10.2016 13:43:21
  voiceip: вер. 7.0.189 / 08.04.2016 17:40:15

Окружение:

  Клиент:
    os: Windows 7 amd64, 6.1
    java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_51
    jre home: C:\Program Files\Java\jre1.8.0_51
    memory (use/total/max): 53M/121M/228M
    default tz: 21.12.2016 13:04 MSK +0300 (Europe/Moscow)
    user tz: 21.12.2016 12:04 EET +0200 (Europe/Kaliningrad)
    locale: ru_RU
  Сервер:
    os: Linux amd64, 3.2.0-4-amd64
    java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_102
    jre home: /opt/java/jdk1.8.0_102/jre
    default tz: 21.12.2016 13:01 MSK +0300 (Europe/Moscow)
    memory (use/total/max): 234M/672M/7282M
    db time: master: 21.12.2016 13:01 MSK
    db charset: connection: cp1251(cp1251_general_ci), database: cp1251(cp1251_general_ci)
    locale: ru_RU
    uptime: Started: 13.12.2016 08:39:05 Uptime: 8 d 04:22:01

Автор:  Cobra57 [ 21 дек 2016, 16:06 ]
Заголовок сообщения:  Re: Кодировка с Базе данных

Упс... простите, уже сам нашел ответ :) - Посмотрел заголовки XML'ек

Автор:  dimOn [ 21 дек 2016, 17:24 ]
Заголовок сообщения:  Re: Кодировка с Базе данных

ну вы обновлялись недавно, после лета, видимо, не? сейчас они в utf-8 раньше в 1251 были. реальная кодировка без разницы, в бд это поле блоб и код нормально читает учитывая заголовки xml

Автор:  zavndw [ 22 дек 2016, 11:11 ]
Заголовок сообщения:  Re: Кодировка с Базе данных

реест счетов в cp1251 выгружается)
bill: вер. 7.0.107 / 10.11.2016 16:31:13

Автор:  Akhmat [ 31 май 2017, 14:47 ]
Заголовок сообщения:  Re: Кодировка с Базе данных

Привет всем.
С модулем билл, давно документы не выставлял, и какая то лажа с кодировкой. база в cp1251, документы формируются в utf-8, в xslt указана кодировка utf-8, но в результате биллинг позиции документа неверно отображает. bill: вер. 6.2.97 / 14.12.2016 14:33:00

Автор:  dimOn [ 31 май 2017, 15:04 ]
Заголовок сообщения:  Re: Кодировка с Базе данных

есчо раз: документы хранятся в бинарном блобе и кодирвка БД или таблицы на них никак не влияет. старые документы в 1251 сериализованы, новые в utf-8, соответственно и заголовки xml такие же там, потому корректно обрабатываться должно всё если правильно вычитывать.
1) скриншот конкретного документа покажите
2) и запись в бд соответствующую

Автор:  ok-2004 [ 31 май 2017, 15:08 ]
Заголовок сообщения:  Re: Кодировка с Базе данных

Цитата:
....база в cp1251....bill: вер. 6.2.97.....


Да! это старая багофича...

Попробуйте :
https://forum.bitel.ru/viewtopic.php?f= ... 397#p96746
и
https://forum.bitel.ru/viewtopic.php?f= ... 397#p96769

ЗЫ:
и позвольте уж совсем интимный вопрос : в data.properties стоит вот так ?:
Код:
db.url=jdbc:mysql://x.x.x.x/bgbilling?useUnicode=true&characterEncoding=UTF-8&connectionCollation=utf8_unicode_ci....

Автор:  dimOn [ 31 май 2017, 15:15 ]
Заголовок сообщения:  Re: Кодировка с Базе данных

я всё равно настаиваю как и в темах по ссылкам что надо разобраться, не должно ничего биться и от кодировок зависеть. а если есть ошибка - то надо исправить в биллинге, но надо её отловить

Автор:  dimOn [ 31 май 2017, 15:23 ]
Заголовок сообщения:  Re: Кодировка с Базе данных

покажите:

show create table bill_data_ххх

select xml from bill_data_ххх where format_number='B-666'

где xxx- mid модуля, а B-666 номер вашего документа с кракозябрами

Автор:  Akhmat [ 31 май 2017, 15:26 ]
Заголовок сообщения:  Re: Кодировка с Базе данных

в data.properties cp1251
скрины

Вложения:
2017-05-31_12-24-29.png
2017-05-31_12-24-29.png [ 20.84 КБ | Просмотров: 10558 ]
2017-05-31_12-23-16.png
2017-05-31_12-23-16.png [ 18.47 КБ | Просмотров: 10558 ]

Автор:  dimOn [ 31 май 2017, 15:34 ]
Заголовок сообщения:  Re: Кодировка с Базе данных

1) а, так стоп, это в счёте/форме? это несколько другая уже проблема может быть.
а в клиенте, в GUI, в таблице, этот документ нормально отображается? Ну т.е. там если на счёт кликнуть там таблица с позициями внизу итд - это всё корректно там отображается или так же?

2) а заголовок, т.е. начало этой xml как раз больше интересует, что там написано? <?xml version="1.0" encoding="UTF-8"?> ведь ?

Автор:  dimOn [ 31 май 2017, 15:35 ]
Заголовок сообщения:  Re: Кодировка с Базе данных

потому что про форму итд - это может быть банально со шрифтами проблема или что-то типа того, это стандартный шаблон у вас?
это вообще скрин из клиента "просмотреть документ"?

Автор:  Akhmat [ 31 май 2017, 15:45 ]
Заголовок сообщения:  Re: Кодировка с Базе данных

Спасибо Димон.
нашел проблему, когда с модуля создаешь счета, то все норм с кодировкой. но у меня они глобальным скриптом создаются.
там видимо в cp1251 пишутся.

в скрипте поправил. все норм

Вложения:
2017-05-31_12-39-15.png
2017-05-31_12-39-15.png [ 22.32 КБ | Просмотров: 10556 ]

Автор:  dimOn [ 31 май 2017, 16:01 ]
Заголовок сообщения:  Re: Кодировка с Базе данных

без разницы в какой кодировке пишутся) главное как в базу добавляете, нельзя добавлять через ps.setString() например, если будете тем более в utf-8 писать там, а база у вас 1251
код покажите скрипта? который сериализует и в базу кладёт, скажу как правильнее

Автор:  dimOn [ 31 май 2017, 16:04 ]
Заголовок сообщения:  Re: Кодировка с Базе данных

если на скрине последнем - это то что у вас добавил скрипт, то так вижу: что сериализуете вы в utf-8 верно, и заголовок правильный, а потом в базе оно у вас бьётся потому что вы пытаетесь как строку сохранить а вам её в 1251 перекодирует БД-сервер

вот на предыдущем скрине из вебовского вашего sql-редактора как раз нормальные кракозябры - там типа utf8 у вас видно, но читается у вас в 1251 потому что он думает что БД у вас ведь в 1251 и так и отображает, там уже косяк просмотрщика (в родном sqlредакторе биллинга так же будет наверное, т.к. там всё же безкодировочные данные)

Автор:  Akhmat [ 31 май 2017, 16:05 ]
Заголовок сообщения:  Re: Кодировка с Базе данных

было
Код:
      InputStream is = new ByteArrayInputStream( xml.getBytes("windows-1251") );

стало
Код:
      InputStream is = new ByteArrayInputStream( xml.getBytes("utf-8") );

и все норм

Автор:  dimOn [ 31 май 2017, 16:12 ]
Заголовок сообщения:  Re: Кодировка с Базе данных

Это всё равно неправильно, но такой хак работать будет в принципе.

У вас xml это строка явно, вы её откуда берёте? В неё сериализуете или её собираете вручную?

Правильно так: вообще ни каком месте не переводить в String между БД и xml-документом в коде.
Читать из ResultSet как getBytes и сразу в таком виде и засовывать в xml-парсер (не знаю уж как вы там делаете)
И обратное: когда генерируете Document (если вы его создаёте как dom.Document, а не строками собираете) потом сериализуете его в byte[] (ну через ByteArrayOutputStream , например ) а не в String, и так и пишете в БД как setBytes()
Тогда проблем не будет 100% ни с новыми ни со старыми документами.

Автор:  dimOn [ 31 май 2017, 16:18 ]
Заголовок сообщения:  Re: Кодировка с Базе данных

в БД в этом поле нет понятия кодировки, там просто бинарник
и в документе dom тоже нет понятия кодировки, там из бинарника оно восстанавливается согласно заголовку с кодировкой
а посередине если находится явовский String, то и вылезают все эти проблемы: т.к. всегда при любых преобразованиях String <-> байты подразумевается какая-то "кодировка", а у вас в оба конца такие делаются преобразования
вот кои проблемы старательно вычищались вроде как в биллинге, например

Автор:  Akhmat [ 31 май 2017, 16:24 ]
Заголовок сообщения:  Re: Кодировка с Базе данных

этот скрипт древний, помоему на основе кода из вики его создавал.
неправильно не страшно, "работает не трожь" :)

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/