Kovalenko Dmitry wrote:
Я туда передаю нули. То есть BPB не заполняю в принципе. Я как-то
очень давно курил этот вопрос и решил отказаться от этой заморочки. То
бишь я закладываюсь на то, что все блобы имеют кодовую страницу
_подключения_.
Фигово. Т.к. кодировка подключения обычно WIN1251, и в UNICODE-поле у
тебя пишутся однобайтовые русские символы (до 2.1 перекодировки не
было). Что обработать никак низзя и что мы как раз пытаемся улучшить.
Потому что определить чарсет блобовой колонки, в общем случае, очень
напряжно.
Угу. Но в 2.1 с этим проще.
Вся проблема пошла оттого, что в 2.1 сервер стал конвертировать *строки*
из *чарсета коннекта* в UNICODE при занесении данных в RDB$SOURCE и
RDB$DESCRIPTION. Т.е. теперь предполагается, что русские буквы в DDL
(например, комментарии в процедуре) будут в чарсете коннекта.
И это есть ГУД!
Все зависит от тех, кто работает с UTF-ным чарсетом коннекта. Есть
подозрение, что могие из них пихают SQL-текст (в API-вызовы) как ANSI
вместо UTF8.
Побочный эффект - если RDB$SOURCE/DESCRIPTION блобы читать без указания
чарсета в BPB, то получишь юникодовскую белиберду вместо русского
текста. Именно это визуально наблюдается в IBE и компарере. ISQL же
указывает чарсет коннекта в BPB при чтении системных блобов, так что она
извлекает данные нормально.
Не понятно. Если при записи блоба вы его перекодируете из
чарсета_подключения в чарсет_колонки, то почему тогда вы его при
чтении обратно не перекодируете в чарсет_подключения ...
Я выше специально отметил - перекодировка идет *строк* (DDL-текст,
комментарии) в UNICODE. Т.к. кодировка строк определяется чарсетом
коннекта. А вот кодировка блобов определяется ихним BPB. Так уж заложено
в нашем API. И если там пусто, то никакой перекодировки не будет. Т.к.
мало кто пишет именно *блобы* в RDB$SOURCE (обычно все же строки), то
это не проблема (если только с RDB$DESCRIPTION некоторые тулзы так
работают, в худшем случае). Но вот все читают блобы именно как блоб, не
указывая чарсет. Отчего и огребают в 2.1. Выход - всегда указывать
чарсет при работе с блобами, как это делает ISQL.
--
Дмитрий Еманов