web-dev-qa-db-fra.com

Le problème Postgres codant "UTF8" n'a pas d'équivalent dans le codage "LATIN1"

Notre serveur de base de données de production postgres possède une base de données appelée crd_production qui est née du template1 base de données de modèles. Par ailleurs, sur une boîte Ubuntu 12.04, l'encodage par défaut des bases de données template1 et template0 lors de la création initiale du pgcluster avait un encodage par défaut de LATIN1. J'avais laissé tomber le template1 db et l'a recréé avec un encodage utf-8 comme vous pouvez le voir ci-dessous.

      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)

Nous avons finalement déployé notre application Rails (3.2.11) et commencé à utiliser le crd_production db comme base de données principale. Il n'y a aucun problème lorsque ActiveRecord écrit/lit des données, mais lorsque j'essaie de lancer une requête SQL à partir de la ligne de commande psql sur cette base de données, l'erreur suivante se produit -

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" 

Quel pourrait être le problème ici? Est-ce un problème avec le client?

20
papdel

Comme deviné, le problème était avec l'encodage client sur la base de données.

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

Pour changer le codage client en UTF-8, vous devez le faire

crd_production=#  SET client_encoding = 'UTF8';
SET

Revérifier

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

Les choses fonctionnent bien maintenant.

51
papdel

J'ai le même cas avant avec Ruby on Rails on postgresql 10. C'est l'astuce

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

Source: Comment changez-vous l'encodage des caractères d'une base de données postgres?

2
Mada Aryakusumah