Firebird + UTF8

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

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

Firebird + UTF8

Сообщение lordgray » 23.03.2016 15:05:39

Здравствуйте!
Есть поле 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, там еще проще, но суть та же.
Как решить проблему?
lordgray
новенький
 
Сообщения: 60
Зарегистрирован: 10.10.2010 00:19:11

Re: Firebird + UTF8

Сообщение sts » 23.03.2016 15:28:34

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


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

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


вам надо почитать доку к Firebird, что значит у них VARCHAR(8) - количество символов или размер в байтах, в Oracle это настраивается и часть таблиц может быть и так и эдак.
ну и надо все DB либы переписывать под поддержку utf8.
sts
постоялец
 
Сообщения: 431
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Firebird + UTF8

Сообщение *Rik* » 23.03.2016 16:40:50

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
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 451
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Re: Firebird + UTF8

Сообщение lordgray » 23.03.2016 17:36:38

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

Re: Firebird + UTF8

Сообщение storma » 13.05.2016 15:28:34

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

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

А так, за прекрасные компоненты спасибо. Благодаря им сбежал с DELPHI.
storma
новенький
 
Сообщения: 11
Зарегистрирован: 07.02.2013 22:54:14


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru