Lazarus + IBM DB2

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

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

Lazarus + IBM DB2

Сообщение Shipovnix » 02.10.2019 11:49:56

При выполнении запроса из Lazarus к БД на DB2 через ODBC (db2cli for ODBC) поля результата запроса с русским текстом отображаются вопросительными знаками (напр. ????????????????????????).
Кодовая страница базы данных = 1251, кодовый набор базы данных = 1251.
Что нужно сделать, чтобы это победить? Актуально также будет и для инсертов/апдейтов русского текста.
Аватара пользователя
Shipovnix
незнакомец
 
Сообщения: 8
Зарегистрирован: 14.03.2019 12:11:14

Re: Lazarus + IBM DB2

Сообщение Снег Север » 02.10.2019 22:29:54

Отображаются где - в гриде на форме? Так надо преобразовывать cp1251 в utf8, подсказывает Кэп.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Lazarus + IBM DB2

Сообщение Shipovnix » 03.10.2019 09:32:10

Да, в гриде, и в любых кантролах на форме. Кэп подсказал, но матрос не знает работающих средств конвертации полученного результата запроса. Посему прошу подсказать их.
Аватара пользователя
Shipovnix
незнакомец
 
Сообщения: 8
Зарегистрирован: 14.03.2019 12:11:14

Re: Lazarus + IBM DB2

Сообщение Vadim » 03.10.2019 09:41:09

Shipovnix
Вы к серверу БД подключаетесь через компонент "ODBCConnection"?
Попробуйте в свойстве этого компонента, которое называется "CharSet", написать "utf8".

Shipovnix писал(а):матрос не знает работающих средств конвертации полученного результата запроса

Таких матросов не бывает. А вот юнга - это другое дело... ;-) :D
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Lazarus + IBM DB2

Сообщение Shipovnix » 03.10.2019 09:55:58

Юнга, так юнга.
Vadim писал(а):Попробуйте в свойстве этого компонента, которое называется "CharSet", написать "utf8".

Это я пробовал, ровно никакого эффекта.
Аватара пользователя
Shipovnix
незнакомец
 
Сообщения: 8
Зарегистрирован: 14.03.2019 12:11:14

Re: Lazarus + IBM DB2

Сообщение Vadim » 03.10.2019 11:27:31

Shipovnix
А если наоборот поставить - cp1251 ?
Или вот ещё вариант. У Вас ведь отдельный файл настроек в ODBC должен быть. Может быть там есть куда charset utf8 поставить?

У меня старая база в MSSQL. Там кодировка тоже 1251. Однако если в CharSet поставить utf8 то русские буквы отображаются в высшей степени прекрасно. Но, правда, соединение с MSSQL напрямую с сервером, без всяких доисторических посредников, типа ODBC.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Lazarus + IBM DB2

Сообщение Shipovnix » 03.10.2019 12:32:30

Да, такие варианты тоже попробовал, и 1250, и 1252 заодно тыкал.
Vadim писал(а):Shipovnix
Или вот ещё вариант. У Вас ведь отдельный файл настроек в ODBC должен быть. Может быть там есть куда charset utf8 поставить?

Есть там файл настроек, сейчас он выглядит так:
Код: Выделить всё
[BIUD]
UnicodeServer=1
DateTimeStringFormat=ISO
DBALIAS=BIUD
PWD=***
UID=***

Ни в одном пункте настроек больше нет ничего, связанного с кодировкой.
Раньше, на Delphi7 + ADO, думаю, вообще не возникло бы проблем без использования ODBC. Но, увы, ТЗ такое ТЗ.
Аватара пользователя
Shipovnix
незнакомец
 
Сообщения: 8
Зарегистрирован: 14.03.2019 12:11:14

Re: Lazarus + IBM DB2

Сообщение Снег Север » 03.10.2019 12:32:52

В SQLQuery есть свойство Translate.
Попробуйте поставить там типа
SQLQuery1.Translate('cp1251','UTF8',true)

Есть еще функция CP1251ToUTF8.

И, наконец, в некоторых базах конвертация не работает, если тип поля двоичный, а не символьный, в этих случая помогает конвертация в символы в самом запросе SQL.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Lazarus + IBM DB2

Сообщение Shipovnix » 03.10.2019 12:58:30

Команда
Код: Выделить всё
QBIUD.Translate('cp1251', 'utf8', True);

даёт ошибку Access Violation.
Конвертация в символы в самом запросе тоже даёт ошибку DB2:
Код: Выделить всё
SELECT o.LOGIN, o.RE, o.RA, CAST(o.FA AS VARCHAR(255) CCSID 1209) AS SURNAME
FROM CS.OPERATOR AS o
WHERE o.LOGIN LIKE 'admin'
FETCH FIRST 1 ROWS ONLY WITH UR;

тоже даёт ошибку DB2 — "An unexpected token '1209' was found...". Пробовал разные CCSID: и utf8, и UNICODE, и, наоборот, 1251 — всё это вызывает ошибку DB2. Без ошибки запрос отрабатывает только с конструкцией CCSID ASCII, но это кракозябры.
Аватара пользователя
Shipovnix
незнакомец
 
Сообщения: 8
Зарегистрирован: 14.03.2019 12:11:14

Re: Lazarus + IBM DB2

Сообщение Vadim » 03.10.2019 13:07:19

Shipovnix писал(а):[BIUD]
UnicodeServer=1

А если туда 0 поставить? Ведь если подумать, то база то никакая не Unicode...

Ещё один вариант. В настройках самого сервера DB2 есть возможность указать кодировку для отправляемых клиенту данных?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Lazarus + IBM DB2

Сообщение Shipovnix » 03.10.2019 13:10:35

Vadim писал(а):А если туда 0 поставить?

Не помогает... Как и совсем удалить этот параметр.

Добавлено спустя 11 минут 33 секунды:
Vadim писал(а):Ещё один вариант. В настройках самого сервера DB2 есть возможность указать кодировку для отправляемых клиенту данных?

Ненене, изменять кодировку отправляемых клиенту данных (если такое возможно) мне не разрешено.
Аватара пользователя
Shipovnix
незнакомец
 
Сообщения: 8
Зарегистрирован: 14.03.2019 12:11:14

Re: Lazarus + IBM DB2

Сообщение Vadim » 03.10.2019 17:02:34

Shipovnix
А если попробовать сменить компоненты: ZeosLib + AdoDB ? Правда эта связка только для винды, на Линуксе AdoDB нет даже в проекте.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Lazarus + IBM DB2

Сообщение Shipovnix » 03.10.2019 19:33:03

Vadim писал(а):А если попробовать сменить компоненты: ZeosLib + AdoDB ?

А разве есть порт ADO на Lazarus?
Аватара пользователя
Shipovnix
незнакомец
 
Сообщения: 8
Зарегистрирован: 14.03.2019 12:11:14

Re: Lazarus + IBM DB2

Сообщение Vadim » 03.10.2019 21:03:40

Shipovnix писал(а):А разве есть порт ADO на Lazarus?

Ado для Lazarus - он немного в другом смысле. ;-) Ado, вне всякого сомнения, он для винды и в нём внутри. Однако в ZeosLib сделан модуль, который с помощью интерфейсов (а Ado - это как раз набор интерфейсов) может к этому самому Ado подключаться. Следовательно, если мы в Ado создадим подключение к тому или иному серверу БД, то с помощью этого модуля можно через посредство Ado таскать оттуда данные.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Lazarus + IBM DB2

Сообщение iskander » 04.10.2019 13:17:08

Если я правильно путаю, есть еще возможность перекодировки в обработчиках OnGetText/OnSetText строковых полей TSQLQuery.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru