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?
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.
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?