powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Замена ф-ии convert при переходе на 8.3
8 сообщений из 8, страница 1 из 1
Замена ф-ии convert при переходе на 8.3
    #35275490
postuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В базе первые таблицы создавались в KOI8, потом стал делать в UTF8. При выводе в запросах использовал ф-ию convert(text,'UTF8','KOI8'). Но в 8.3 этой ф-ии уже нет.
В одной из тем нашел предложение использовать:
Код: plaintext
ALTER ROLE user1 SET client_encoding to 'KOI8';
Но это не помогло, при выводе на экран UTF так и остается UTF-ом. В чем может быть проблема и как ее можно решить.
Как я понял, установка кодировки для пользователя должна приводить к выводу данных в указанной кодировке... Не понимаю, почему не работает.
Заранее спасибо.
...
Рейтинг: 0 / 0
Замена ф-ии convert при переходе на 8.3
    #35275774
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
postuserПри выводе в запросах использовал ф-ию convert(text,'UTF8','KOI8'). Но в 8.3 этой ф-ии уже нет.
есть
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
seb=> \df *convert*
                               Список функций
   Схема    |     Имя      | Тип данных результата | Типы данных аргументов
------------+--------------+-----------------------+------------------------
 pg_catalog | convert      | bytea                 | bytea, name, name
 pg_catalog | convert_from | text                  | bytea, name
 pg_catalog | convert_to   | bytea                 | text, name
( 3  rows)
для того что бы автоматически перекодировывалось из кодировки клиента в кодировку сервера и наоборот - нужно было просто установить правильную кодировку клиента, через SET client_encoding to 'KOI8'; или set names 'koi8'; convert для этого использовать было не нужно.
postuserНе понимаю, почему не работает.не работает потому что не должно. не может быть нескольких кодировок в одном кластере. у Вас база повреждена, часть таблиц в кодировке utf-8 часть в koi8. Вам нужно всё привести к одной какой-то кодировке.
...
Рейтинг: 0 / 0
Замена ф-ии convert при переходе на 8.3
    #35286841
postuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ёш postuserПри выводе в запросах использовал ф-ию convert(text,'UTF8','KOI8'). Но в 8.3 этой ф-ии уже нет.
есть
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
seb=> \df *convert*
                               Список функций
   Схема    |     Имя      | Тип данных результата | Типы данных аргументов
------------+--------------+-----------------------+------------------------
 pg_catalog | convert      | bytea                 | bytea, name, name
 pg_catalog | convert_from | text                  | bytea, name
 pg_catalog | convert_to   | bytea                 | text, name
( 3  rows)
для того что бы автоматически перекодировывалось из кодировки клиента в кодировку сервера и наоборот - нужно было просто установить правильную кодировку клиента, через SET client_encoding to 'KOI8'; или set names 'koi8'; convert для этого использовать было не нужно.
postuserНе понимаю, почему не работает.не работает потому что не должно. не может быть нескольких кодировок в одном кластере. у Вас база повреждена, часть таблиц в кодировке utf-8 часть в koi8. Вам нужно всё привести к одной какой-то кодировке.
Привел все к одной кодировке (KOI8). Теперь нужно при запросе получить данные в,н-р, WIN1251. Пробую это в консоле (psql), выполняю
Код:
SET client_encoding TO 'WIN1251'
. Но при этом все равно данные не выводятся в WIN... Пробовал и в клиентской программе.
Где я делаю не так?
...
Рейтинг: 0 / 0
Замена ф-ии convert при переходе на 8.3
    #35286890
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
postuserПривел все к одной кодировке (KOI8). Теперь нужно при запросе получить данные в,н-р, WIN1251. Пробую это в консоле (psql), выполняю
Код:
SET client_encoding TO 'WIN1251'
. Но при этом все равно данные не выводятся в WIN... Пробовал и в клиентской программе.
Где я делаю не так?Вы всё делаете правильно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
seb=> SET client_encoding TO 'WIN1251';
SET
seb=> select * from t1 where id =  18 ;
 id |      val
----+---------------
  18  | русский текст
( 1  запись)

seb=> SET client_encoding TO 'koi8';
SET
seb=> select * from t1 where id =  18 ;
 id |      val
----+---------------
  18  | ТХУУЛЙК ФЕЛУФ
( 1  запись)

seb=> SET client_encoding TO 'utf8';
SET
seb=> select * from t1 where id =  18 ;
 id |      val
----+---------------
  18  | русский текст
( 1  запись)
что у вас не работает ? "Но при этом все равно данные не выводятся в WIN... " -- а в каком виде выводятся ? может быть у Вас банально кодировка терминала не win1251 поэтому вместо текста Вы видите бНОПНю ?
...
Рейтинг: 0 / 0
Замена ф-ии convert при переходе на 8.3
    #35286903
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
postuserПривел все к одной кодировке (KOI8).кодировку кластера и локаль точно поменяли ? кластер пересоздали ? локаль запущенного процесса postgres точно теперь ru_RU.KOI8-R ? или у Вас windows ?
...
Рейтинг: 0 / 0
Замена ф-ии convert при переходе на 8.3
    #35288886
postuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ёш postuserПривел все к одной кодировке (KOI8).кодировку кластера и локаль точно поменяли ? кластер пересоздали ? локаль запущенного процесса postgres точно теперь ru_RU.KOI8-R ? или у Вас windows ?
Вот последовательность действий:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
psql -l
could not change directory to "/root"
        List of databases
   Name    |  Owner   | Encoding
-----------+----------+-----------
 postgres  | postgres | SQL_ASCII
 template0 | postgres | SQL_ASCII
 template1 | postgres | SQL_ASCII
 test      | postgres | SQL_ASCII
( 4  rows)
Кодировка Putty - KOI8-R
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
test=# CREATE TABLE test (p1 text);
CREATE TABLE
test=# INSERT INTO test (p1) VALUES ('текст в KOI8');
INSERT  0   1 
test=#
test=#
test=# SELECT * FROM test ;
      p1
--------------
 текст в KOI8
( 1  row)

test=# SET client_encoding TO 'WIN1251';
SET
test=# SELECT * FROM test ;
      p1
--------------
 текст в KOI8
( 1  row)

test=# SET client_encoding TO 'UTF8';
SET
test=# SELECT * FROM test ;
   p1
--------
   KOI8
( 1  row)

Смена вывода только при переводе в UTF8 (русский текст не видно, при больших словах появляется что-то типа
Код: plaintext
   8  |  ..          |            | t
).
Кодировку консоли (Putty) не менял (KOI8-R).
...
Рейтинг: 0 / 0
Замена ф-ии convert при переходе на 8.3
    #35289483
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
postuser
Name | Owner | Encoding
-----------+----------+-----------
postgres | postgres | SQL_ASCII
template0 | postgres | SQL_ASCII
template1 | postgres | SQL_ASCII
test | postgres | SQL_ASCIIвот здесь ошибка - у Вас кодировка кластера - sql_ascii, другими словами для потсгреса русский текст в кодировке koi8-r который вы вводите (это коды символов с 128 по 255) эквивалентен всяческим крючочкам/закорючкам которые на этих кодовых местах присутствуют в кодировке SQL_ASCII и которые _не нужно_ ни во что конвертировать. поэтому имхо и не конвертируется.

Вам нужно сделать pg_dumpall, потом удалить кластер, затем initdb --locale=ru_RU.KOI8-R -E KOI8 и загрузить дамп через psql. если данных нет и это просто тестовый кластер - то соответственно сохранять и загружать данные не нужно :)
...
Рейтинг: 0 / 0
Замена ф-ии convert при переходе на 8.3
    #35289503
postuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ёш postuser
Name | Owner | Encoding
-----------+----------+-----------
postgres | postgres | SQL_ASCII
template0 | postgres | SQL_ASCII
template1 | postgres | SQL_ASCII
test | postgres | SQL_ASCIIвот здесь ошибка - у Вас кодировка кластера - sql_ascii, другими словами для потсгреса русский текст в кодировке koi8-r который вы вводите (это коды символов с 128 по 255) эквивалентен всяческим крючочкам/закорючкам которые на этих кодовых местах присутствуют в кодировке SQL_ASCII и которые _не нужно_ ни во что конвертировать. поэтому имхо и не конвертируется.

Вам нужно сделать pg_dumpall, потом удалить кластер, затем initdb --locale=ru_RU.KOI8-R -E KOI8 и загрузить дамп через psql. если данных нет и это просто тестовый кластер - то соответственно сохранять и загружать данные не нужно :)
Спасибо за помощь. Помогло createdb -E KOI8.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Замена ф-ии convert при переходе на 8.3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]