Страница 1 из 1

Firebird + UTF8

СообщениеДобавлено: 23.03.2016 15:05:39
lordgray
Здравствуйте!
Есть поле DOCNUM VARCHAR(8), кодировка базы и поля, UTF8, соединение тоже UTF8. Использую FIBL + Firebird 2.5 + Lazarus 1.6 + FPC 3.0.0 + Win7
Проблема в следующем: пишу через FIBDataSet в это поле 'ПН-00001', а получаю 'ПН-000'.
С одной стороны, понятно, что Length('ПН-000') = 8, как длина поля. Но ведь это не правильно! Попытался через FIBQuery записать, ругается на превышение длины строки.
Полез в исходники, в TFIBStringField.SetAsString, там
Код: Выделить всё
    StrLCopy(Buffer, PChar(ValueStr), Size);

Поскольку размер поля 8, то вот она и обрезка. Попробовал решить в лоб, Size*4, ругается на превышение длины строки.
Глянул исходник IBX под лазарус, там тоже самое. Глянул дельфийский IBX, там еще проще, но суть та же.
Как решить проблему?

Re: Firebird + UTF8

СообщениеДобавлено: 23.03.2016 15:28:34
sts
lordgray писал(а):Length('ПН-000') = 8


это точно? по логике, должно быть, при String = UTF8String

Код: Выделить всё
Length('ПН-000') = 6
SizeOf('ПН-000') = 8


вам надо почитать доку к Firebird, что значит у них VARCHAR(8) - количество символов или размер в байтах, в Oracle это настраивается и часть таблиц может быть и так и эдак.
ну и надо все DB либы переписывать под поддержку utf8.

Re: Firebird + UTF8

СообщениеДобавлено: 23.03.2016 16:40:50
*Rik*
lordgray писал(а):Здравствуйте!
Есть поле DOCNUM VARCHAR(8), кодировка базы и поля, UTF8, соединение тоже UTF8. Использую FIBL + Firebird 2.5 + Lazarus 1.6 + FPC 3.0.0 + Win7
Проблема в следующем: пишу через FIBDataSet в это поле 'ПН-00001', а получаю 'ПН-000'.
С одной стороны, понятно, что Length('ПН-000') = 8, как длина поля. Но ведь это не правильно! Попытался через FIBQuery записать, ругается на превышение длины строки.
Полез в исходники, в TFIBStringField.SetAsString, там
Код: Выделить всё
    StrLCopy(Buffer, PChar(ValueStr), Size);

Поскольку размер поля 8, то вот она и обрезка. Попробовал решить в лоб, Size*4, ругается на превышение длины строки.
Глянул исходник IBX под лазарус, там тоже самое. Глянул дельфийский IBX, там еще проще, но суть та же.
Как решить проблему?

Не тот IBX смотришь.
http://www.visual-t.ru/files/ibx.7z
В параметрах соединения для Lazarus в поле Cahracter set всегда выбирать UTF8

Re: Firebird + UTF8

СообщениеДобавлено: 23.03.2016 17:36:38
lordgray
to sts
VARCHAR(8) это именно 8 символов, а не байт, IBExpert нормально заносит все 8 символов.
to Rik
Спасибо, да, это какой-то другой IBX. Буду изучать. Или переходить на него, если не осилю FIBL подправить.

Re: Firebird + UTF8

СообщениеДобавлено: 13.05.2016 15:28:34
storma
~~~Спасибо, да, это какой-то другой IBX

Список форумов ‹ Программирование ‹ Lazarus - Компоненты и примеры <<== Кто то бы уже привёл в соответствие :D
Так же RX догадайся где искать.

А так, за прекрасные компоненты спасибо. Благодаря им сбежал с DELPHI.