Postgresの本番データベースサーバーには、template1
テンプレートデータベースから生まれたcrd_productionというデータベースがあります。ちなみに、Ubuntu 12.04ボックスでは、pgclusterの初期作成時のtemplate1およびtemplate0データベースのデフォルトエンコーディングには、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がデータを読み書きしているときは問題ありませんが、このデータベースでpsql
コマンドラインからSQLクエリを実行しようとすると、次のエラーが発生します-
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"
ここで何が問題になりますか?クライアントの問題ですか?
推測されるように、問題はデータベースの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)
物事は今うまくいきます。
以前にRuby on Rails on postgresql 10で同じケースがあります。これはトリックです
update pg_database set encoding = pg_char_to_encoding('UTF8') where datname = 'thedb'