А зачем FB2.5 вставляет X перед строковой константой?

Access Violation, некорректное выполнение запросов или вызовов API, ошибки утилит командной строки, в общем все, что вам мешает работать

Модераторы: kdv, dimitr

Ответить
mustafa
Сообщения: 67
Зарегистрирован: 07 мар 2006, 17:53

А зачем FB2.5 вставляет X перед строковой константой?

Сообщение mustafa » 02 дек 2010, 10:07

если в теле процедуры написать например _utf8 '';, то после создания процедуры отображаться это будет как _utf8 X'';.
Это зачем?

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Re: А зачем FB2.5 вставляет X перед строковой константой?

Сообщение dimitr » 02 дек 2010, 23:06

где отображаться? В ISQL воспроизводится? Вообще - X это префикс 16-ричного значения. Непонятно, кто и зачем им подменяет оригинал.

mustafa
Сообщения: 67
Зарегистрирован: 07 мар 2006, 17:53

Re: А зачем FB2.5 вставляет X перед строковой константой?

Сообщение mustafa » 03 дек 2010, 10:52

Да, создавал процедуру в ISQL и смотрел результат там-же. X присутствует.

mustafa
Сообщения: 67
Зарегистрирован: 07 мар 2006, 17:53

Re: А зачем FB2.5 вставляет X перед строковой константой?

Сообщение mustafa » 03 дек 2010, 14:35

Вдогонку. Похоже сервер не просто подставляет X, а преобразует строку:
_utf8 'ZZ' -> _utf8 X'5A5A'
_utf8 'СЏ' (это 'я') -> _utf8 X'D18F'
_win1251 'я' -> _win1251 X'FF'

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: А зачем FB2.5 вставляет X перед строковой константой?

Сообщение Dimitry Sibiryakov » 03 дек 2010, 14:37

dimitr писал(а):Непонятно, кто и зачем им подменяет оригинал.
Ставлю на Адриано.

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Re: А зачем FB2.5 вставляет X перед строковой константой?

Сообщение dimitr » 05 дек 2010, 22:54

mustafa писал(а):Да, создавал процедуру в ISQL и смотрел результат там-же. X присутствует.
смотрел через show или через экспорт в скрипт?
mustafa писал(а):Похоже сервер не просто подставляет X, а преобразует строку
это сразу было понятно :-) Но вопрос "зачем" остается открытым. Чарсет коннекта какой? Если отличается от utf8/win1251, то это скорее правильно.

mustafa
Сообщения: 67
Зарегистрирован: 07 мар 2006, 17:53

Re: А зачем FB2.5 вставляет X перед строковой константой?

Сообщение mustafa » 06 дек 2010, 09:26

1 SHOW
2 и дефолтный чарсет базы WIN1251 и подключения WIN1251 и всё одно для _win1251 преобразует.

mustafa
Сообщения: 67
Зарегистрирован: 07 мар 2006, 17:53

Re: А зачем FB2.5 вставляет X перед строковой константой?

Сообщение mustafa » 06 дек 2010, 09:46

Дмитрий, а почему нечитабельный текст это правильно?
что криминального например в: coalesce(RDB$GET_CONTEXT(...), _utf8 'пусто'), что надо это преобразовывать в hex?

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Re: А зачем FB2.5 вставляет X перед строковой константой?

Сообщение dimitr » 07 дек 2010, 22:56

ты DDL серверу скармливаешь в кодировке подключения, например win1251. А внутри в нем есть куски в другой кодировке, указанной через префикс. Сервер текст процедуры пытается сохранить в столбце utf8, для чего перекодирует его из win1251. Это делается целиком (как блоб), без повторного парсинга. Чтобы транслитерация прошла успешно, надо гарантировать принадлежность всех символов блоба к win1251. Префиксные литералы это портят, поэтому и приводятся заранее (при парсинге) к hex-виду (сиречь: ascii, которая априори совместима с utf8). Как-то так.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: А зачем FB2.5 вставляет X перед строковой константой?

Сообщение kdv » 09 дек 2010, 20:41

то есть, мораль такая - в процедурах и триггерах не писать _utf8 '...', а писать просто строковую константу. Если она написана в 1251, то она преобразуется в юникод, и будет нормально работать в коннектах как 1251, так и utf8.
В противном случае, поытка писать константы utf для использования с другими национальными кодировками может привести к проблемам. Например, пишем _win1251 '...', потом открываем коннект в win1252, и ... перекодировки нет, облом.
Грубо говоря, если начал работать с базой в utf8, и с чарсетом коннекта utf, то уже нет смысла указывать _кодировка.

p.s. могу быть неправ, только не знаю в чем.

mustafa
Сообщения: 67
Зарегистрирован: 07 мар 2006, 17:53

Re: А зачем FB2.5 вставляет X перед строковой константой?

Сообщение mustafa » 12 дек 2010, 12:37

В приведённом примере это замена cast (получается короче и читабельней :) ), т.к. для этих функций объявлен чарсет NONE, а у меня независимо от чарсета подключения (воизбежание попыток перекодировки в чарсет подключения) строки в эти функции всегда передаются в utf8.
Потому как не всегда можно гарантировать что все и всегда будут подключаться только с определённым чарсетом, а перейти разом на юникод как-то не получается.

Ответить