Lazarus + IBM DB2
Модератор: Модераторы
Lazarus + IBM DB2
При выполнении запроса из Lazarus к БД на DB2 через ODBC (db2cli for ODBC) поля результата запроса с русским текстом отображаются вопросительными знаками (напр. ????????????????????????).
Кодовая страница базы данных = 1251, кодовый набор базы данных = 1251.
Что нужно сделать, чтобы это победить? Актуально также будет и для инсертов/апдейтов русского текста.
Кодовая страница базы данных = 1251, кодовый набор базы данных = 1251.
Что нужно сделать, чтобы это победить? Актуально также будет и для инсертов/апдейтов русского текста.
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Re: Lazarus + IBM DB2
Отображаются где - в гриде на форме? Так надо преобразовывать cp1251 в utf8, подсказывает Кэп.
Re: Lazarus + IBM DB2
Да, в гриде, и в любых кантролах на форме. Кэп подсказал, но матрос не знает работающих средств конвертации полученного результата запроса. Посему прошу подсказать их.
Re: Lazarus + IBM DB2
Shipovnix
Вы к серверу БД подключаетесь через компонент "ODBCConnection"?
Попробуйте в свойстве этого компонента, которое называется "CharSet", написать "utf8".
Таких матросов не бывает. А вот юнга - это другое дело...

Вы к серверу БД подключаетесь через компонент "ODBCConnection"?
Попробуйте в свойстве этого компонента, которое называется "CharSet", написать "utf8".
Shipovnix писал(а):матрос не знает работающих средств конвертации полученного результата запроса
Таких матросов не бывает. А вот юнга - это другое дело...
Re: Lazarus + IBM DB2
Юнга, так юнга.
Это я пробовал, ровно никакого эффекта.
Vadim писал(а):Попробуйте в свойстве этого компонента, которое называется "CharSet", написать "utf8".
Это я пробовал, ровно никакого эффекта.
Re: Lazarus + IBM DB2
Shipovnix
А если наоборот поставить - cp1251 ?
Или вот ещё вариант. У Вас ведь отдельный файл настроек в ODBC должен быть. Может быть там есть куда charset utf8 поставить?
У меня старая база в MSSQL. Там кодировка тоже 1251. Однако если в CharSet поставить utf8 то русские буквы отображаются в высшей степени прекрасно. Но, правда, соединение с MSSQL напрямую с сервером, без всяких доисторических посредников, типа ODBC.
А если наоборот поставить - cp1251 ?
Или вот ещё вариант. У Вас ведь отдельный файл настроек в ODBC должен быть. Может быть там есть куда charset utf8 поставить?
У меня старая база в MSSQL. Там кодировка тоже 1251. Однако если в CharSet поставить utf8 то русские буквы отображаются в высшей степени прекрасно. Но, правда, соединение с MSSQL напрямую с сервером, без всяких доисторических посредников, типа ODBC.
Re: Lazarus + IBM DB2
Да, такие варианты тоже попробовал, и 1250, и 1252 заодно тыкал.
Есть там файл настроек, сейчас он выглядит так:
Ни в одном пункте настроек больше нет ничего, связанного с кодировкой.
Раньше, на Delphi7 + ADO, думаю, вообще не возникло бы проблем без использования ODBC. Но, увы, ТЗ такое ТЗ.
Vadim писал(а):Shipovnix
Или вот ещё вариант. У Вас ведь отдельный файл настроек в ODBC должен быть. Может быть там есть куда charset utf8 поставить?
Есть там файл настроек, сейчас он выглядит так:
Код: Выделить всё
[BIUD]
UnicodeServer=1
DateTimeStringFormat=ISO
DBALIAS=BIUD
PWD=***
UID=***Ни в одном пункте настроек больше нет ничего, связанного с кодировкой.
Раньше, на Delphi7 + ADO, думаю, вообще не возникло бы проблем без использования ODBC. Но, увы, ТЗ такое ТЗ.
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Re: Lazarus + IBM DB2
В SQLQuery есть свойство Translate.
Попробуйте поставить там типа
SQLQuery1.Translate('cp1251','UTF8',true)
Есть еще функция CP1251ToUTF8.
И, наконец, в некоторых базах конвертация не работает, если тип поля двоичный, а не символьный, в этих случая помогает конвертация в символы в самом запросе SQL.
Попробуйте поставить там типа
SQLQuery1.Translate('cp1251','UTF8',true)
Есть еще функция CP1251ToUTF8.
И, наконец, в некоторых базах конвертация не работает, если тип поля двоичный, а не символьный, в этих случая помогает конвертация в символы в самом запросе SQL.
Re: Lazarus + IBM DB2
Команда
даёт ошибку Access Violation.
Конвертация в символы в самом запросе тоже даёт ошибку DB2:
тоже даёт ошибку DB2 — "An unexpected token '1209' was found...". Пробовал разные CCSID: и utf8, и UNICODE, и, наоборот, 1251 — всё это вызывает ошибку DB2. Без ошибки запрос отрабатывает только с конструкцией CCSID ASCII, но это кракозябры.
Код: Выделить всё
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, но это кракозябры.
Re: Lazarus + IBM DB2
Shipovnix писал(а):[BIUD]
UnicodeServer=1
А если туда 0 поставить? Ведь если подумать, то база то никакая не Unicode...
Ещё один вариант. В настройках самого сервера DB2 есть возможность указать кодировку для отправляемых клиенту данных?
Re: Lazarus + IBM DB2
Vadim писал(а):А если туда 0 поставить?
Не помогает... Как и совсем удалить этот параметр.
Добавлено спустя 11 минут 33 секунды:
Vadim писал(а):Ещё один вариант. В настройках самого сервера DB2 есть возможность указать кодировку для отправляемых клиенту данных?
Ненене, изменять кодировку отправляемых клиенту данных (если такое возможно) мне не разрешено.
Re: Lazarus + IBM DB2
Shipovnix
А если попробовать сменить компоненты: ZeosLib + AdoDB ? Правда эта связка только для винды, на Линуксе AdoDB нет даже в проекте.
А если попробовать сменить компоненты: ZeosLib + AdoDB ? Правда эта связка только для винды, на Линуксе AdoDB нет даже в проекте.
Re: Lazarus + IBM DB2
Vadim писал(а):А если попробовать сменить компоненты: ZeosLib + AdoDB ?
А разве есть порт ADO на Lazarus?
Re: Lazarus + IBM DB2
Shipovnix писал(а):А разве есть порт ADO на Lazarus?
Ado для Lazarus - он немного в другом смысле.
Re: Lazarus + IBM DB2
Если я правильно путаю, есть еще возможность перекодировки в обработчиках OnGetText/OnSetText строковых полей TSQLQuery.
