Lazarus Postgress
Модератор: Модераторы
Lazarus Postgress
Добрый день.
Пишу приложение под WinXp. База данных Postgres база в кодировке koi8-r.
Lazarus версии 1.4.4
При выполнениий запросов в DBGrid данные показываются нормально. Как только выполняешь insert или update в БД то слетает кодировка и при последующих селектах данные в DBGrid в виде квардратиков.
В PQConnection1 CharSet = UTF8
Подскажите что не так в настройках?
Спасибо.
Пишу приложение под WinXp. База данных Postgres база в кодировке koi8-r.
Lazarus версии 1.4.4
При выполнениий запросов в DBGrid данные показываются нормально. Как только выполняешь insert или update в БД то слетает кодировка и при последующих селектах данные в DBGrid в виде квардратиков.
В PQConnection1 CharSet = UTF8
Подскажите что не так в настройках?
Спасибо.
в этом помоему и проблемма
укажи свою кодировку и подключении
Код: Выделить всё
PQConnection1 CharSet = UTF8укажи свою кодировку и подключении
http://www.postgresql.org/docs/current/ ... ibyte.html
Server Character Set <=> Available Client Character Sets
KOI8R <=> KOI8R, ISO_8859_5, MULE_INTERNAL, UTF8, WIN866, WIN1251
И т.д. Оно?
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
И т.д. Оно?
DYUMON писал(а):в этом помоему и проблемма
Код: Выделить всё
PQConnection1 CharSet = UTF8
укажи свою кодировку и подключении
Если поменять PQConnection1 CharSet = UTF8 на KOI8 или WIN1251 то при выборке или в компонентах кириллические названия и данные кубиками.
Я так понимаю, что если WinXP то кодировка win1251.
Добавлено спустя 5 минут 26 секунд:
resident писал(а):http://www.postgresql.org/docs/current/static/multibyte.htmlPostgreSQL 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, WIN1251To 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 писал(а):А как этим пользоваться? Подскажите пожалуйста.
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 писал(а):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 писал(а):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 -a6. Какие где применяются?
Код: Выделить всё
localeresident писал(а):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=
Не знаю что дальше. Вроде все как написано, и кодировка клиента стоит UTF, и сам Лазарус UTF. Должно работать.
У себя ради эксперимента попробовал весь сервер на KOI8-R изменить (вроде как сделал вашу ситуацию наоборот)
Проверка
И что бы я не ставил в Лазарусе, сервер все равно пишет кодировку KOI8R
Т.е. вот этот код бесполезен:
У себя ради эксперимента попробовал весь сервер на 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;
Что же делать ?
Варианты:
1. Сконвертировать всю базу в UTF и забыть про KOI
2. Ждать пока кто-нить подойдет из больших
3. Пошукать на заграничном форуме. Были случаи когда после бесполезных разговоров здесь там сразу был найден ответ
http://forum.lazarus.freepascal.org/ind ... tion=forum
1. Сконвертировать всю базу в UTF и забыть про KOI
2. Ждать пока кто-нить подойдет из больших
3. Пошукать на заграничном форуме. Были случаи когда после бесполезных разговоров здесь там сразу был найден ответ
http://forum.lazarus.freepascal.org/ind ... tion=forum
Zeos не пробовал использовать?
Они как то более человеческие.
Когда то пробовал TPQConnection использовать для работы с pg использовать, но желание отбил тот факт что нельзя порт использовать отличный от 5432.
Они как то более человеческие.
Когда то пробовал TPQConnection использовать для работы с pg использовать, но желание отбил тот факт что нельзя порт использовать отличный от 5432.
Замечено, если в Lazarus после insert или update сделать реконнект к БД
PQConnection1.Connected:=False;
PQConnection1.Connected:=True;
то все нормально отображается.
Пробовал в Дельфи 7 но с компонентом ZeOS (ZConnection) у него есть параметр codepage=WIN1251 все работало.
PQConnection1.Connected:=False;
PQConnection1.Connected:=True;
то все нормально отображается.
Пробовал в Дельфи 7 но с компонентом ZeOS (ZConnection) у него есть параметр codepage=WIN1251 все работало.
