Lazarus Postgress

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

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

Lazarus Postgress

Сообщение Axi » 27.11.2015 10:34:21

Добрый день.

Пишу приложение под WinXp. База данных Postgres база в кодировке koi8-r.
Lazarus версии 1.4.4
При выполнениий запросов в DBGrid данные показываются нормально. Как только выполняешь insert или update в БД то слетает кодировка и при последующих селектах данные в DBGrid в виде квардратиков.
В PQConnection1 CharSet = UTF8
Подскажите что не так в настройках?
Спасибо.
Axi
новенький
 
Сообщения: 15
Зарегистрирован: 23.10.2014 22:18:41

Re: Lazarus Postgress

Сообщение DYUMON » 27.11.2015 14:17:01

в этом помоему и проблемма
Код: Выделить всё
PQConnection1 CharSet = UTF8

укажи свою кодировку и подключении
Аватара пользователя
DYUMON
постоялец
 
Сообщения: 234
Зарегистрирован: 11.03.2009 13:32:54

Re: Lazarus Postgress

Сообщение resident » 28.11.2015 01:16:34

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

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

Re: Lazarus Postgress

Сообщение Axi » 30.11.2015 10:15:17

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

И т.д. Оно?

А как этим пользоваться? Подскажите пожалуйста.
Axi
новенький
 
Сообщения: 15
Зарегистрирован: 23.10.2014 22:18:41

Re: Lazarus Postgress

Сообщение resident » 30.11.2015 12:50:40

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

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

Насколько я понял нам вобще без разницы в какой кодировке база. Главное чтобы сервер был настроен на кодировку нашего Lazarus клиента, т.е. на UTF. Для начала проверить кодировку клиента по умолчанию - в линуксе из командной строки набрать:
Код: Выделить всё
su postgres
psql --dbname=victoria
SHOW client_encoding;

У меня как бы все на UTF уже настроено
Код: Выделить всё
client_encoding
-----------------
UTF8
(1 row)

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

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

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

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


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

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

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

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

Код: Выделить всё
SELECT UPPER('анг.: abc рус.: ёйфы тур.: Bağışlar Köy çeşmesi');
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Lazarus Postgress

Сообщение Axi » 01.12.2015 09:53:48

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. Локали у вас?

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

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

***********************************
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"
Axi
новенький
 
Сообщения: 15
Зарегистрирован: 23.10.2014 22:18:41

Re: Lazarus Postgress

Сообщение resident » 01.12.2015 22:02:27

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. Какие где применяются?
Код: Выделить всё
locale
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Lazarus Postgress

Сообщение Axi » 03.12.2015 10:16:26

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. Какие где применяются?
Код: Выделить всё
locale


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=
Axi
новенький
 
Сообщения: 15
Зарегистрирован: 23.10.2014 22:18:41

Re: Lazarus Postgress

Сообщение resident » 03.12.2015 13:08:22

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

У себя ради эксперимента попробовал весь сервер на KOI8-R изменить (вроде как сделал вашу ситуацию наоборот)
Код: Выделить всё
sudo update-locale LANG=ru_RU.KOI8-R
sudo dpkg-reconfigure locales
sudo shutdown -r now

Проверка
Код: Выделить всё
locale


И что бы я не ставил в Лазарусе, сервер все равно пишет кодировку KOI8R
Т.е. вот этот код бесполезен:
procedure Tdm.PQConnectionAfterConnect(Sender: TObject);
begin
PQConnection.CharSet:= 'utf8';
PQConnection.ExecuteDirect('set client_encoding to ' + QuotedStr('utf8') + ';');
end;
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Lazarus Postgress

Сообщение Axi » 03.12.2015 14:39:15

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

Re: Lazarus Postgress

Сообщение resident » 03.12.2015 15:19:59

Варианты:
1. Сконвертировать всю базу в UTF и забыть про KOI
2. Ждать пока кто-нить подойдет из больших
3. Пошукать на заграничном форуме. Были случаи когда после бесполезных разговоров здесь там сразу был найден ответ :mrgreen:
http://forum.lazarus.freepascal.org/ind ... tion=forum
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Lazarus Postgress

Сообщение DYUMON » 03.12.2015 15:49:41

Zeos не пробовал использовать?
Они как то более человеческие.
Когда то пробовал TPQConnection использовать для работы с pg использовать, но желание отбил тот факт что нельзя порт использовать отличный от 5432.
Аватара пользователя
DYUMON
постоялец
 
Сообщения: 234
Зарегистрирован: 11.03.2009 13:32:54

Re: Lazarus Postgress

Сообщение Axi » 03.12.2015 16:02:13

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


Вернуться в Lazarus

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

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

Рейтинг@Mail.ru
cron