web-dev-qa-db-ja.com

「UTF8」をエンコードするPostgresの問題には、「LATIN1」をエンコードする同等の機能がありません

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" 

ここで何が問題になりますか?クライアントの問題ですか?

20
papdel

推測されるように、問題はデータベースの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)

物事は今うまくいきます。

51
papdel

以前にRuby on Rails on postgresql 10で同じケースがあります。これはトリックです

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

ソース: postgresデータベースの文字エンコーディングをどのように変更しますか?

2