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.


--
Дмитрий Еманов

Reply via email to