31

我们的 postgres 生产数据库服务器有一个名为 crd_production 的数据库,它源于template1模板数据库。顺便说一句,在 Ubuntu 12.04 机器上,初始创建 pgcluster 时 template1 和 template0 数据库的默认编码具有 LATIN1 的默认编码。我已经删除了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)

我们最终部署了我们的 rails(3.2.11) 应用程序并开始使用crd_productiondb 作为主数据库。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" 

这里可能是什么问题?是客户端的问题吗?

4

2 回答 2

65

正如猜测的那样,问题出在数据库上的 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)

现在一切正常。

于 2013-01-25T16:01:34.007 回答
9

我以前在 postgresql 10 上使用 ruby​​ on rails 有同样的情况。这就是诀窍

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

资料来源:如何更改 postgres 数据库的字符编码?

于 2018-09-08T22:43:19.017 回答