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

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

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

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

Сообщение resident » 14.02.2016 22:41:48

Пробую навигационный способ работы с базой по статье
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 19:23:47, всего редактировалось 2 раз(а).
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

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

Сообщение Снег Север » 15.02.2016 08:58:58

никогда не работал с Postrges, но такое характерно, если для базы не установлена поддержка юникода.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3052
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение vada » 15.02.2016 12:41:00

При создании базы в постгресе какую кодировку задавал? Это важно. Какая кодировка в постгресе по умолчанию? Это тоже важно.
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

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

Сообщение Vadim » 15.02.2016 18:45:41

Вроде бы при установке Postgres кодировка для шаблона БД берётся системная...
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

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

Сообщение resident » 16.02.2016 00:40:43

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?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

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

Сообщение azsx » 16.02.2016 03:47:14

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

да, я сталкивался с такой ошибкой, но я знал, что юзаю рассово неверные кодировки. Убедитесь, что у вас записывает переменную:
p1 := 'zzz';
p2 := 'ZZZ';
Если запишет - то сращу описывайте, как вы получаете данные для записи в бд. Если не запишет, то сдаюсь.
azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

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

Сообщение SSerge » 16.02.2016 05:46:40

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


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

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


Скорее всего, это значит, что где-то применяется преобразование из системной кодовой страницы в utf8 - maybe в коде компонента, который принимает ваши строки; ибо ваш лазарус, а вкупе с компилятором (2.6, да?) ни малейшего представления о кодировках используемых строк не имеют
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

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

Сообщение vada » 16.02.2016 10:58:06

resident PostgreSQL работает с кодировками правильно. Проверене 100500 раз на клиентах DOS, Windows, Linux (koi-8,1251,UTF8), Mac OS.
Смотрите в лазарусе.
Код: Выделить всё
____.FieldByName('page_format').AsString := 'НОВЫЙ ТЕКСТ';
точно в UTF-8?
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

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

Сообщение resident » 16.02.2016 11:12:10

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 должен читать текст из узла.
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: [Решено] Запись в базу белиберды или только первого симв

Сообщение azsx » 17.02.2016 05:14:26

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

Библиотека Oxml на 1251, знаете?
Может весь вопрос в том, что вам надо конвертировать кодировки?
azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

Re: [Решено] Запись в базу белиберды или только первого симв

Сообщение resident » 17.02.2016 10:51:31

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 заработал? Конвертация по Лазарусовски?
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51


Вернуться в Lazarus

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

Сейчас этот форум просматривают: Yandex [Bot] и гости: 241

Рейтинг@Mail.ru