Интересный баг SQLQuery

Вопросы программирования и использования среды Lazarus.

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

Ответить
miraj_mv
незнакомец
Сообщения: 3
Зарегистрирован: 08.11.2012 14:56:49

Интересный баг SQLQuery

Сообщение miraj_mv »

Нашел интересный баг SQLQuery, на некоторых полях при выборке из базы Postgres 8.4 обрезает некоторое количество символов пока заметил только на полях varchar. То есть если поле например 8 символов то Лазарус читает и отображает только 6 символов. Самое интересное что не все поля обрезает.
Lazarus 0.9.30.4 r35940 FPC 2.6.0 i386-win32-win32/win64. Пробовал также и на Лазарусе 1.0.2 тоже самое. Что это и как его победить?
Climber
постоялец
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Re: Интересный баг SQLQuery

Сообщение Climber »

Это не баг, это фича. Старая, как мир. Способов решения - несколько. Это происходит с юникодными символами. Попробуйте создать поле типа varchar (он вроде character varying назывался там, не?) размером 2 символа и записать туда первый символ - латинскую букву, а второй - русскую. Будет еще веселее :wink:
Простейший способ решения проблемы - удвоить размер всех полей такого типа в БД. Способ более правильный (тут кто-то писал несколько лет назад) - в каком-то из системных что ли модулей подправить одну константу, а потом пересобрать fpc. Только где, какую и какие будут побочные эффекты (какие-то вроде будут) - я не помню.
Аватара пользователя
stikriz
энтузиаст
Сообщения: 612
Зарегистрирован: 15.03.2006 08:37:47

Re: Интересный баг SQLQuery

Сообщение stikriz »

Climber писал(а):Это происходит с юникодными символами.

Потому, что надо использовать TWideStringField. Попробуйте создать с помощью Ins вручную в редакторе полей. Если по умолчанию создается TStringField, то это баг в либе. У конекта есть метод AddFieldDefs. Не знаю как сделали у постгри, но обычно там вызывается что-то вроде TranslateFldType, там в зависимости от типа поля, которое возвращает СУБД подставляется тип филды. Бага где-то там.

Добавлено спустя 4 минуты 54 секунды:
И еще. У нормальных СУБД обязана быть такая фича - должна быть возможность указать кодировку с которой хочет работать клиент. Если, например, база юникодовская, а я хочу работать с win1251, то где-то в параметрах подключения я должен иметь возможность указать кодировку win1251. И тогда все запросы посылать, и все строки получать я буду в этой кодировке. Уверен, что постгри имеет такую фичу. Например, FireBird всегда так мог.
Ответить