Lazarus Postgress

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

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

Ответить
Axi
новенький
Сообщения: 15
Зарегистрирован: 23.10.2014 22:18:41

Lazarus Postgress

Сообщение Axi »

Добрый день.

Пишу приложение под WinXp. База данных Postgres база в кодировке koi8-r.
Lazarus версии 1.4.4
При выполнениий запросов в DBGrid данные показываются нормально. Как только выполняешь insert или update в БД то слетает кодировка и при последующих селектах данные в DBGrid в виде квардратиков.
В PQConnection1 CharSet = UTF8
Подскажите что не так в настройках?
Спасибо.
Аватара пользователя
DYUMON
постоялец
Сообщения: 234
Зарегистрирован: 11.03.2009 12:32:54
Контактная информация:

Сообщение DYUMON »

в этом помоему и проблемма

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

PQConnection1 CharSet = UTF8

укажи свою кодировку и подключении
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

http://www.postgresql.org/docs/current/ ... ibyte.html
PostgreSQL supports automatic character set conversion between server and client for certain character set combinations. The conversion information is stored in the pg_conversion system catalog. PostgreSQL comes with some predefined conversions, as shown in Table 22-2. You can create a new conversion using the SQL command CREATE CONVERSION.

Server Character Set <=> Available Client Character Sets
KOI8R <=> KOI8R, ISO_8859_5, MULE_INTERNAL, UTF8, WIN866, WIN1251
To enable automatic character set conversion, you have to tell PostgreSQL the character set (encoding) you would like to use in the client. There are several ways to accomplish this

И т.д. Оно?
Axi
новенький
Сообщения: 15
Зарегистрирован: 23.10.2014 22:18:41

Сообщение Axi »

DYUMON писал(а):в этом помоему и проблемма

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

PQConnection1 CharSet = UTF8

укажи свою кодировку и подключении


Если поменять PQConnection1 CharSet = UTF8 на KOI8 или WIN1251 то при выборке или в компонентах кириллические названия и данные кубиками.
Я так понимаю, что если WinXP то кодировка win1251.

Добавлено спустя 5 минут 26 секунд:
resident писал(а):http://www.postgresql.org/docs/current/static/multibyte.html
PostgreSQL supports automatic character set conversion between server and client for certain character set combinations. The conversion information is stored in the pg_conversion system catalog. PostgreSQL comes with some predefined conversions, as shown in Table 22-2. You can create a new conversion using the SQL command CREATE CONVERSION.

Server Character Set <=> Available Client Character Sets
KOI8R <=> KOI8R, ISO_8859_5, MULE_INTERNAL, UTF8, WIN866, WIN1251
To enable automatic character set conversion, you have to tell PostgreSQL the character set (encoding) you would like to use in the client. There are several ways to accomplish this

И т.д. Оно?

А как этим пользоваться? Подскажите пожалуйста.
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

Axi писал(а):А как этим пользоваться? Подскажите пожалуйста.

1. Какая кодировка клиента у вас?

Насколько я понял нам вобще без разницы в какой кодировке база. Главное чтобы сервер был настроен на кодировку нашего Lazarus клиента, т.е. на UTF. Для начала проверить кодировку клиента по умолчанию - в линуксе из командной строки набрать:

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

su postgres
psql --dbname=victoria
SHOW client_encoding;

У меня как бы все на UTF уже настроено

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

 client_encoding
-----------------
 UTF8
(1 row)

(victoria - это имя моей базы, у вас своё)

**************************
Далее необязательные нам сведения, но все же.

2. Кодировка сервера у вас?

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

SHOW server_encoding;


***********************************
3. Локали у вас?


Вывод сюда скопируйте.

***********************************
4. Проходит ли преобразование в верхний регистр?

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

SELECT UPPER('анг.: abc рус.: ёйфы тур.: Bağışlar Köy çeşmesi');
Axi
новенький
Сообщения: 15
Зарегистрирован: 23.10.2014 22:18:41

Сообщение Axi »

resident писал(а):
Axi писал(а):А как этим пользоваться? Подскажите пожалуйста.

1. Какая кодировка клиента у вас?

Насколько я понял нам вобще без разницы в какой кодировке база. Главное чтобы сервер был настроен на кодировку нашего Lazarus клиента, т.е. на UTF. Для начала проверить кодировку клиента по умолчанию - в линуксе из командной строки набрать:

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

su postgres
psql --dbname=victoria
SHOW client_encoding;

У меня как бы все на UTF уже настроено

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

 client_encoding
-----------------
 UTF8
(1 row)

(victoria - это имя моей базы, у вас своё)

**************************
Далее необязательные нам сведения, но все же.

2. Кодировка сервера у вас?

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

SHOW server_encoding;


***********************************
3. Локали у вас?


Вывод сюда скопируйте.

***********************************
4. Проходит ли преобразование в верхний регистр?

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

SELECT UPPER('анг.: abc рус.: ёйфы тур.: Bağışlar Köy çeşmesi');


1. UTF8
2. KOI8R
3. В Windows XP подозреваю Win1251
4. ERROR: character with byte sequence 0xc4 0x9f in encoding "UTF8" has no equivalent in encoding "KOI8R"
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

Axi писал(а):3. В Windows XP подозреваю Win1251

Обратный слеш и l - это команда (psql) линукс, вводите там же где и остальные SHOW, SELECT и т.д. В выводе должны быть все базы.

Axi писал(а):4. ERROR: character with byte sequence 0xc4 0x9f in encoding "UTF8" has no equivalent in encoding "KOI8R"

Логично, споткнулся на турецкой букве, а чисто кириллицу переведет?

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

SELECT UPPER('рус.: ёйфы');


Добавлено спустя 13 минут 58 секунд:
5. Список установленных локалей (сразу как соединитесь в командной строке)?

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

locale -a


6. Какие где применяются?
Axi
новенький
Сообщения: 15
Зарегистрирован: 23.10.2014 22:18:41

Сообщение Axi »

resident писал(а):
Axi писал(а):3. В Windows XP подозреваю Win1251

Обратный слеш и l - это команда (psql) линукс, вводите там же где и остальные SHOW, SELECT и т.д. В выводе должны быть все базы.

Axi писал(а):4. ERROR: character with byte sequence 0xc4 0x9f in encoding "UTF8" has no equivalent in encoding "KOI8R"

Логично, споткнулся на турецкой букве, а чисто кириллицу переведет?

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

SELECT UPPER('рус.: ёйфы');


Добавлено спустя 13 минут 58 секунд:
5. Список установленных локалей (сразу как соединитесь в командной строке)?

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

locale -a


6. Какие где применяются?


3.
base | postgres | KOI8R | ru_RU.KOI8R | ru_RU.KOI8R |
4. base=# SELECT UPPER('рус.: ёйфы');
upper
------------
РУС.: ЁЙФЫ
(1 row)

5. Большой список, в котором есть:
ru_RU
ru_RU.koi8r
ru_RU.utf8

6.
LANG=ru_RU.UTF-8
LC_CTYPE=ru_UA.utf8
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=
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

Не знаю что дальше. Вроде все как написано, и кодировка клиента стоит UTF, и сам Лазарус UTF. Должно работать.

У себя ради эксперимента попробовал весь сервер на KOI8-R изменить (вроде как сделал вашу ситуацию наоборот)

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

sudo update-locale LANG=ru_RU.KOI8-R
sudo dpkg-reconfigure locales
sudo shutdown -r now

Проверка


И что бы я не ставил в Лазарусе, сервер все равно пишет кодировку KOI8R
Т.е. вот этот код бесполезен:
procedure Tdm.PQConnectionAfterConnect(Sender: TObject);
begin
PQConnection.CharSet:= 'utf8';
PQConnection.ExecuteDirect('set client_encoding to ' + QuotedStr('utf8') + ';');
end;
Axi
новенький
Сообщения: 15
Зарегистрирован: 23.10.2014 22:18:41

Сообщение Axi »

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

Сообщение resident »

Варианты:
1. Сконвертировать всю базу в UTF и забыть про KOI
2. Ждать пока кто-нить подойдет из больших
3. Пошукать на заграничном форуме. Были случаи когда после бесполезных разговоров здесь там сразу был найден ответ :mrgreen:
http://forum.lazarus.freepascal.org/ind ... tion=forum
Аватара пользователя
DYUMON
постоялец
Сообщения: 234
Зарегистрирован: 11.03.2009 12:32:54
Контактная информация:

Сообщение DYUMON »

Zeos не пробовал использовать?
Они как то более человеческие.
Когда то пробовал TPQConnection использовать для работы с pg использовать, но желание отбил тот факт что нельзя порт использовать отличный от 5432.
Axi
новенький
Сообщения: 15
Зарегистрирован: 23.10.2014 22:18:41

Сообщение Axi »

Замечено, если в Lazarus после insert или update сделать реконнект к БД
PQConnection1.Connected:=False;
PQConnection1.Connected:=True;
то все нормально отображается.
Пробовал в Дельфи 7 но с компонентом ZeOS (ZConnection) у него есть параметр codepage=WIN1251 все работало.
Ответить