Кодировка проблемы Postgres UTF8 не имеет эквивалента в кодировке LATIN1

На нашем сервере производственной базы данных postgres есть база данных crd_production, созданная на основе базы данных шаблонов template1. Между прочим, в системе Ubuntu 12.04 кодировка по умолчанию для баз данных template1 и template0 при первоначальном создании pgcluster имела кодировку по умолчанию LATIN1. Я отбросил template1 db и создал его заново с кодировкой utf-8, как вы можете видеть ниже.

      Name      |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges   
----------------+----------+----------+------------+------------+-----------------------
 crd_production | deployer | UTF8     | en_US.utf8 | en_US.utf8 | 
 postgres       | postgres | UTF8     | en_US.utf8 | en_US.utf8 | 
 template0      | postgres | LATIN1   | en_US      | en_US      | =c/postgres          +
                |          |          |            |            | postgres=CTc/postgres
 template1      | postgres | UTF8     | en_US.utf8 | en_US.utf8 | 
(4 rows)

В конце концов мы развернули наше приложение rails (3.2.11) и начали использовать crd_production db в качестве первичной базы данных. Нет проблем, когда ActiveRecord записывает / читает данные, но когда я пытаюсь запустить любой sql-запрос из командной строки psql в этой базе данных, возникает следующая ошибка:

crd_production=# select * from users;
ERROR:  character with byte sequence 0xe2 0x80 0x9c in encoding "UTF8" has no equivalent in encoding "LATIN1" 

crd_production=# select * from features;
ERROR:  character with byte sequence 0xe2 0x80 0x99 in encoding "UTF8" has no equivalent in encoding "LATIN1" 

В чем может быть проблема? Это проблема с клиентом?


person papdel    schedule 25.01.2013    source источник


Ответы (2)


Как и предполагалось, проблема была в client_encoding в базе данных.

crd_production=# show client_encoding;
 client_encoding 
-----------------
 LATIN1
(1 row)

Чтобы изменить кодировку клиента на UTF-8, вам необходимо сделать это

crd_production=#  SET client_encoding = 'UTF8';
SET

Проверьте еще раз

crd_production=# show client_encoding;
 client_encoding 
-----------------
 UTF8
(1 row)

Теперь все работает нормально.

person papdel    schedule 25.01.2013
comment
Посмотрите, сможете ли вы изменить набор пользователей client_encoding = 'UTF8'; чтобы сделать это с этого момента липким. Или изменить базу данных, если хотите. - person Scott Marlowe; 26.01.2013
comment
У меня такая же ошибка, но когда я пытался проверить client_encoding, он показывал мне UNICODE вместо LATIN1. Хм. - person majidarif; 09.04.2016
comment
@ScottMarlowe FYI, похоже, это не работает для меня: stackoverflow.com/q/36922248/1157054 - person Ajedi32; 28.04.2016
comment
Привет, я немного запутался в этом client_encoding и server_encoding, может ли кто-нибудь объяснить разницу? - person Twaha Mehmood; 22.01.2018

У меня уже был такой же случай с рубином на рельсах на postgresql 10. Это трюк.

update pg_database set encoding = pg_char_to_encoding('UTF8') where datname = 'thedb'

Источник: Как изменить кодировку символов база данных postgres?

person Mada Aryakusumah    schedule 08.09.2018
comment
Стоит отметить, что этот подход фактически изменяет кодировку базы данных, а не только вашего (локального?) Клиента. Это может вызвать проблемы у других людей, использующих базу данных и предполагающих другую кодировку! Если вы не уверены, что это нормально, измените клиента, как предлагает ответ Папдела. - person James Bradbury; 22.03.2019