Кодировка выпусков Postgres "UTF8" не имеет эквивалента в кодировке "LATIN1" - программирование
Подтвердить что ты не робот

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

Наш сервер базы данных производства postgres имеет базу данных crd_production, которая родилась из базы данных шаблона template1. Кстати, в поле Ubuntu 12.04 по умолчанию для баз данных template1 и template0 при первоначальном создании pgcluster была установлена ​​кодировка LATIN1 по умолчанию. Я сбросил db template1 и создал его заново с помощью кодировки 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)

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

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" 

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

4b9b3361

Ответ 1

Как уже было догадалось, проблема была в 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)

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