-
rrrrrrr © (22.08.17 14:49) [20]прототип завода по утилизации как-то уж слишком замороченных погромистов
http://i.makeagif.com/media/6-10-2014/FAQmDj.gif
возрастные ограничения на гиф : 35+ -
Чемпаркароке © (22.08.17 15:19) [21]Firebird 2.5 Language Reference Update
Table 5.1. Character sets new in Firebird
Name UTF8
Max bytes/ch. 4
Languages All
Added in 2.0 -
rrrrrrr © (22.08.17 15:26) [22]и што?
тем более что это про типы данных сервера -
Чемпаркароке © (28.08.17 15:12) [23]докладываю результаты экспериментов
я оказался прав - все дело в интерпретации драйвером
теперь подробно
--------------------------------------
исследуя исходники IBX, наткнулся наfunction TIBXSQLVAR.GetCharsetSize: Integer;
begin
case SQLVar.SQLSubtype and $FF of
0, 1, 2, 10, 11, 12, 13, 14, 19, 21, 22, 39,
45, 46, 47, 50, 51, 52, 53, 54, 55, 58 : Result := 1;
5, 6, 8, 44, 56, 57, 64 : Result := 2;
3 :
begin
// System Tables incorrectly state they are in Unicode_Fss character set but they are not
if POS('RDB$', SQLVar.RelName) = 1 then
Result := 1
else
Result := 3;
end;
59 : Result := 4;
else
Result := 1;
end;
end;
как видно, в код жестко зашиты идентификаторы чарсетов, причем для UTF8=59
это очень нехорошо, но для IBX, предназначенных для работы с InterBase, это простительно
однако простой анализ таблицы RDB$CHARACTER_SETS в БД на FireBird показывает, что там для UTF8 идентификатор=4, а код 59 соответствует чарсету WIN1256
для эксперимента подсоединяемся к БД с этим чарсетом (хоть через IBX, хоть через dbExpress) и - вуаля! - размер поля на клиенте становится корректным
из всего этого можно сделать несколько выводов:
1. в момент разветвления IB6 и FB1 идентификаторы чарсетов совпадали, но дальше каждый разработчик добавлял новые чарсеты со своими ID по своему усмотрению и в свой момент
2. драйвер dbxfb.dll явно делался по исходникам для dbxint.dll, возможно, условной компиляцией отдельных кусочков (в бинарнике четко прослеживаются имена модулей с "IB", а также присутствует SQL-тип данных BOOLEAN, которого в 2010 г в FB еще не было)
3. программисты драйвера наверняка тоже зашили в код ID чарсетов вместо того, чтобы считать и интерпретировать корректно данные из RDB$CHARACTER_SETS -
> вместо того, чтобы считать и интерпретировать корректно данные из RDB$CHARACTER_SETS
// System Tables incorrectly state they are in Unicode_Fss character set but they are not
переведи. все они интерпретировали корректно... на тот момент когда писали. -
+ писал же про путаницу
> ты видать пытаешся работать с utf в ansi(вернее ascii) строках
и тут похоже так и есть, пытаются интерпретировать длину по ascii представлению utf-ного символа. чего в ado бы быть не должно т.к. utf должен был однозначно преобразован к юникоду (в понимании мелкософта) и имел бы всегда длину символа в 2 байта. -
> а код 59 соответствует чарсету WIN1256
вообще не соответствует, а показывает, что конкретно этот код из utf-8 состоит из 4-ех байт/ascii символов. -
Чемпаркароке © (28.08.17 18:07) [27]
> sniknik © (28.08.17 17:20) [24]
ты невнимателен:
1. UNICODE_FSS - это другая кодировка
2. речь идет о системных таблицах, что в них данные не в заявленной кодировке, а не некорректных кодировках каких-то других таблиц
> ты видать пытаешся работать с utf в ansi(вернее ascii) строках
снова догадки
я работаю БЕЗ ansi-строк, да и все методы компонентов доступа тоже
> sniknik © (28.08.17 17:54) [26]
а тут вообще пальцем в небо
код 59 - это не код символа, а внутренний ID чарсета, только это разные чарсеты в IB и FB, несмотря на одинаковость кода
вот цитата из http://www.ibase.ru/unicode_faq/
В rdb$character_sets кодировка UTF8 имеет в Firebird идентификатор 4 (это был свободный номер рядом с давно имеющейся в IB и FB кодировкой UNICODE_FSS с ID = 3), а в InterBase – 59. Код 59 в Firebird имеет кодировка WIN1256. То есть, разработчики InterBase не ставили перед собой вопрос обеспечения совместимости с Firebird в этом плане. -
> ты невнимателен:
а ты английский не знаешь...
> 1. UNICODE_FSS - это другая кодировка
> 2. речь идет о системных таблицах ...
вот именно это в комментарии к "костылю" и написано, что в системных указана Unicode_Fss хотя там другая. притом это было тогда, когда писался код, сейчас, если в системных исправили, то ситуация поменялась на обратную.
> я работаю БЕЗ ansi-строк, да и все методы компонентов доступа тоже
как скажешь.
> Код 59 в Firebird имеет кодировка WIN1256.
код 59 это точка с запятой (;). и он не может иметь кодировку WIN1256. символы с одинаковыми кодами могут входить в разные кодировки и выглядеть по разному в разных кодировках, но вот конкретно 59 и в WIN1256 тоже точка с запятой. т.е. как ты определил, что один из символов ; ; в 1251, а другой в 1256 не понятно... может ты про кодировку в параметрах поля говоришь? -
Чемпаркароке © (28.08.17 22:05) [29]
> sniknik © (28.08.17 21:36) [28]
английский - мой почти родной
в том комменте system tables и they взаимозаменяемы, поэтому в методе и проверяется наличие 'RDB$' в названии таблицы, чтобы ее не перекодировать при чтении
а RDB$ - это префикс системной таблицы, и никакой другой
к остальным таблицам этот коммент просто не относится
> код 59 это точка с запятой (;)
59 - это ИДЕНТИФИКАТОР для чарсета, указанный в системной таблице, а не какой-то там символ непонятно где
прочитай еще раз цитату с ibase.ru -
> 59 - это ИДЕНТИФИКАТОР для чарсета
вот теперь вообще ничего не понимаю... 1 идентификатор на всю строку? для кодировки с переменным числом байт на символ? бред.