Нашел интересный баг SQLQuery, на некоторых полях при выборке из базы Postgres 8.4 обрезает некоторое количество символов пока заметил только на полях varchar. То есть если поле например 8 символов то Лазарус читает и отображает только 6 символов. Самое интересное что не все поля обрезает.
Lazarus 0.9.30.4 r35940 FPC 2.6.0 i386-win32-win32/win64. Пробовал также и на Лазарусе 1.0.2 тоже самое. Что это и как его победить?
Интересный баг SQLQuery
Модератор: Модераторы
Re: Интересный баг SQLQuery
Это не баг, это фича. Старая, как мир. Способов решения - несколько. Это происходит с юникодными символами. Попробуйте создать поле типа varchar (он вроде character varying назывался там, не?) размером 2 символа и записать туда первый символ - латинскую букву, а второй - русскую. Будет еще веселее
Простейший способ решения проблемы - удвоить размер всех полей такого типа в БД. Способ более правильный (тут кто-то писал несколько лет назад) - в каком-то из системных что ли модулей подправить одну константу, а потом пересобрать fpc. Только где, какую и какие будут побочные эффекты (какие-то вроде будут) - я не помню.
Простейший способ решения проблемы - удвоить размер всех полей такого типа в БД. Способ более правильный (тут кто-то писал несколько лет назад) - в каком-то из системных что ли модулей подправить одну константу, а потом пересобрать fpc. Только где, какую и какие будут побочные эффекты (какие-то вроде будут) - я не помню.
Re: Интересный баг SQLQuery
Climber писал(а):Это происходит с юникодными символами.
Потому, что надо использовать TWideStringField. Попробуйте создать с помощью Ins вручную в редакторе полей. Если по умолчанию создается TStringField, то это баг в либе. У конекта есть метод AddFieldDefs. Не знаю как сделали у постгри, но обычно там вызывается что-то вроде TranslateFldType, там в зависимости от типа поля, которое возвращает СУБД подставляется тип филды. Бага где-то там.
Добавлено спустя 4 минуты 54 секунды:
И еще. У нормальных СУБД обязана быть такая фича - должна быть возможность указать кодировку с которой хочет работать клиент. Если, например, база юникодовская, а я хочу работать с win1251, то где-то в параметрах подключения я должен иметь возможность указать кодировку win1251. И тогда все запросы посылать, и все строки получать я буду в этой кодировке. Уверен, что постгри имеет такую фичу. Например, FireBird всегда так мог.
