Firebird + UTF8

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Ответить
lordgray
новенький
Сообщения: 66
Зарегистрирован: 10.10.2010 00:19:11

Firebird + UTF8

Сообщение 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, там еще проще, но суть та же.
Как решить проблему?
sts
энтузиаст
Сообщения: 548
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Сообщение sts »

lordgray писал(а):Length('ПН-000') = 8


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

Код: Выделить всё

Length('ПН-000') = 6
SizeOf('ПН-000') = 8


вам надо почитать доку к Firebird, что значит у них VARCHAR(8) - количество символов или размер в байтах, в Oracle это настраивается и часть таблиц может быть и так и эдак.
ну и надо все DB либы переписывать под поддержку utf8.
Аватара пользователя
*Rik*
постоялец
Сообщения: 453
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал
Контактная информация:

Сообщение *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
lordgray
новенький
Сообщения: 66
Зарегистрирован: 10.10.2010 00:19:11

Сообщение lordgray »

to sts
VARCHAR(8) это именно 8 символов, а не байт, IBExpert нормально заносит все 8 символов.
to Rik
Спасибо, да, это какой-то другой IBX. Буду изучать. Или переходить на него, если не осилю FIBL подправить.
storma
новенький
Сообщения: 11
Зарегистрирован: 07.02.2013 22:54:14

Сообщение storma »

~~~Спасибо, да, это какой-то другой IBX

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

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