Запись в базу белиберды или только первого символа

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

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

Ответить
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Запись в базу белиберды или только первого символа

Сообщение resident »

Пробую навигационный способ работы с базой по статье
http://www.freepascal.ru/article/lazaru ... 416150500/
SQLQuery1.Edit;
SQLQuery1.FieldByName(‘keywords’).AsString:=’Lazarus жжот’;
SQLQuery1.FieldByName(‘text’).AsString:=’Новый текст’;
SQLQuery1.Post;
SQLQuery1.ApplyUpdates;

Это код из статьи, у меня свои названия, но смысл тот же.
Логические, цифровые, временные поля пишет вроде нормально.
А вот строки пишет как:
1) только первый символ, если строка начинается на английскую букву ('Lazarus жжот' >>> "L")
2) белиберду, если начинается на кириллицу ('Новый текст' >>> " \ U !9 ! ")
Как с этим бороться?

Lazarus 1.2.6 (никакие сторонние компоненты для баз данных не использую)
PostrgesQL 9.5
32-бит

з.ы. Нашел похожий баг для Zeos от 2012 года. Только там ParamByName, а у меня FieldByName.
http://zeoslib.sourceforge.net/viewtopic.php?t=3522
Последний раз редактировалось resident 17.02.2016 18:23:47, всего редактировалось 2 раза.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3071
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

никогда не работал с Postrges, но такое характерно, если для базы не установлена поддержка юникода.
Аватара пользователя
vada
энтузиаст
Сообщения: 691
Зарегистрирован: 14.02.2006 12:43:17

Сообщение vada »

При создании базы в постгресе какую кодировку задавал? Это важно. Какая кодировка в постгресе по умолчанию? Это тоже важно.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Вроде бы при установке Postgres кодировка для шаблона БД берётся системная...
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

vada писал(а):При создании базы в постгресе какую кодировку задавал?

Никакую, кластер вроде создался сам с ru_RU.UTF-8 :)
Кстати, "реляционный способ" работает нормально, т.к. SQL команды которые через .ExecSQL.
А "навигационный" способ не работает.
Connection CharSet = UTF8 - пробовал, толку нет.

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

resident@ubuntu:~$ locale -a
C
C.UTF-8
de_DE.utf8
en_US.utf8
fr_FR.utf8
POSIX
ru_RU.utf8

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

resident@ubuntu:~$ locale
LANG=ru_RU.UTF-8
LANGUAGE=
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=

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

SHOW client_encoding;
 client_encoding
-----------------
 UTF8
(1 строка)

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

SHOW server_encoding;
 server_encoding
-----------------
 UTF8
(1 строка)

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

l
                                  Список баз данных
    Имя    | Владелец | Кодировка | LC_COLLATE  |  LC_CTYPE   |     Права доступа
-----------+----------+-----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 |
 template0 | postgres | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 | =c/postgres          +
           |          |           |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 | =c/postgres          +
           |          |           |             |             | postgres=CTc/postgres
 victoria  | captain  | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 |
(4 строки)

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

SELECT UPPER('анг.: abc рус.: ёйфы тур.: Bağışlar Köy çeşmesi');
                      upper
-------------------------------------------------
 АНГ.: ABC РУС.: ЁЙФЫ ТУР.: BAĞIŞLAR KÖY ÇEŞMESI
(1 строка)


Добавлено спустя 56 минут 20 секунд:
Re: Запись в базу белиберды или только первого символа строки
Опыты показали три момента:
1) Если вручную задавать свойство UpdateSQL, то будет все тоже самое - белиберда.
2) Но вот если в этом свойстве UpdateSQL задать присвоение непосредственно как константу 'Новый текст', то она занесется в базу нормально.
Из этого я делаю вывод, что глюк внутри самого Лазаруса где-то с момента присвоения .FieldByName('___').AsString до вывода в SQL запрос на сервер
3) Самый интересный момент, если я заменяю

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

____.FieldByName('page_format').AsString := 'Новый текст';

на большие буквы

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

____.FieldByName('page_format').AsString := 'НОВЫЙ ТЕКСТ';

то обновление вобще не проходит с ошибкой "Неверная последовательность байт для кодировки UTF-8..."
Это значит что Лазарус не отсылает UTF-8?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
azsx
энтузиаст
Сообщения: 959
Зарегистрирован: 16.11.2015 05:38:32

Сообщение azsx »

то обновление вобще не проходит с ошибкой "Неверная последовательность байт для кодировки UTF-8..."
Это значит что Лазарус не отсылает UTF-8?

да, я сталкивался с такой ошибкой, но я знал, что юзаю рассово неверные кодировки. Убедитесь, что у вас записывает переменную:
p1 := 'zzz';
p2 := 'ZZZ';
Если запишет - то сращу описывайте, как вы получаете данные для записи в бд. Если не запишет, то сдаюсь.
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

resident писал(а):Lazarus 1.2.6


А еще старше нельзя было взять?

resident писал(а):Это значит что Лазарус не отсылает UTF-8?


Скорее всего, это значит, что где-то применяется преобразование из системной кодовой страницы в utf8 - maybe в коде компонента, который принимает ваши строки; ибо ваш лазарус, а вкупе с компилятором (2.6, да?) ни малейшего представления о кодировках используемых строк не имеют
Аватара пользователя
vada
энтузиаст
Сообщения: 691
Зарегистрирован: 14.02.2006 12:43:17

Сообщение vada »

resident PostgreSQL работает с кодировками правильно. Проверене 100500 раз на клиентах DOS, Windows, Linux (koi-8,1251,UTF8), Mac OS.
Смотрите в лазарусе.

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

____.FieldByName('page_format').AsString := 'НОВЫЙ ТЕКСТ';
точно в UTF-8?
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

SSerge писал(а): ибо ваш лазарус, а вкупе с компилятором (2.6, да?) ни малейшего представления о кодировках используемых строк не имеют

Установка Lazarus 1.6 RC2 (FPC 3.0.0) решила проблему.

Благодарствую за ответы :)

Добавлено спустя 5 часов 5 минут 30 секунд:
Re: [Решено] Запись в базу белиберды или только первого символа
Теперь другая часть программы после обновления заглючила. Что самое неприятное, так это то что программа работает, но работает неправильно.
Вот код, который на 1.2.6 работал отлично.

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

                if NodeName = 'language' then
                  case Text of
                      'Русский': OfferLanguage := lnRussian;
                      'Английский': OfferLanguage := lnEnglish;
                      'Немецкий': OfferLanguage := lnGerman;
                      'Французский': OfferLanguage := lnFrench;
                  end;

Теперь же, что бы в Text не было бы - case его в упор не видит.
Пришлось вводить временную переменную, только так он смог увидеть.

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

                if  NodeName = 'language' then
                  begin
                    temp_str := Text; // временная переменная, т.к. Лазарус глючит и не видит непосредственно Text из case
                    case temp_str of
                      'Русский': OfferLanguage := lnRussian;
                      'Английский': OfferLanguage := lnEnglish;
                      'Немецкий': OfferLanguage := lnGerman;
                      'Французский': OfferLanguage := lnFrench;
                    end;
                  end; 

Где еще будут такие или иные сюрпризы неизвестно.
И я не могу воспроизвести ошибку, просто из переменной case читает. А у меня Oxml и case должен читать текст из узла.
azsx
энтузиаст
Сообщения: 959
Зарегистрирован: 16.11.2015 05:38:32

Сообщение azsx »

А у меня Oxml и case должен читать текст из узла.

Библиотека Oxml на 1251, знаете?
Может весь вопрос в том, что вам надо конвертировать кодировки?
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

azsx писал(а):Библиотека Oxml на 1251, знаете?

Не знаю, там условная компиляция, черт ногу сломит. Вот у меня так:

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

TXMLNode = class(TObject)  
...
property Text: OWideString read GetText write SetText;
...

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

...
type
  {$IFDEF FPC}
    OWideString = UTF8String;//UTF-8
...

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

...
{$ifdef FPC_HAS_CPSTRING}
  UTF8String          = type AnsiString(CP_UTF8);
...

Как понять AnsiString(CP_UTF8)?

azsx писал(а):Может весь вопрос в том, что вам надо конвертировать кодировки?

Ок, с конвертацией заработало. :)
Но появились еще вопросы:
1) Почему в остальных местах все работает без конвертаций?
2) Что происходит, когда я ввел промежуточную переменную типа string, и case заработал? Конвертация по Лазарусовски?
Ответить