Postgresql

Postgres 客戶端無法檢測到 UTF-8 數據庫

  • February 10, 2014

語境

我正在為我的開發團隊部署一個 Vagrant 盒子,但在恢復 UTF-8 整理轉儲時遇到了問題。我不相信它與現在臭名昭著的*“UTF8”在“LATIN1”*問題中沒有等價物有關,因為我的問題似乎在於客戶端。此外,我已經使用相同的客戶端和伺服器包(9.1)成功地在其他 Precise 機器(儘管是精確 64)上恢復了完全相同的轉儲文件。但是,我不確定我的 Vagrant 盒子中是否可能沒有其他支持庫。

我不能改變創建轉儲文件的方式,但無論如何我不相信問題出在那兒。

問題

我通過創建一個表成功地以程式方式創建和恢復 UTF-8(特別是en_CA.UTF-8)轉儲:

createdb --lc-collate=en_CA.UTF-8 --lc-ctype=en_CA.UTF-8 -E UTF8 -T template0 ${SCHEMA}

(如果相關,我會補充一點,我的其他成功恢復(在精確 64 系統上)不需要任何額外的語言環境參數createdb。)

然後恢復,

pg_restore -d ${SCHEMA} --single-transaction /tmp/${SCHEMA}_-_latest.backup

我已嘗試將postgresql.conf 的 client_encoding註釋掉手動設置為client_encoding = 'UTF8'; 兩者的行為相同。

我的 /etc/default/locale 包含

LC_ALL=en_CA.UTF-8
LANG=en_CA.UTF-8

然而,在psql提示下:

schema=# SELECT * FROM table;
ERROR:  character 0xe28099 of encoding "UTF8" has no equivalent in "LATIN1"

schema=# show server_encoding; show client_encoding;
server_encoding 
-----------------
UTF8
(1 row)

client_encoding 
-----------------
LATIN1
(1 row)

架構是 UTF-8,對吧(所以註釋掉的client_encoding應該使用這個值)?

schema=# SELECT pg_encoding_to_char(encoding) FROM pg_database WHERE datname = ...
pg_encoding_to_char 
---------------------
UTF8
(1 row)

在命令提示符下手動設置有效:

schema=# set client_encoding to UTF8
SET
schema=# show client_encoding;
client_encoding 
-----------------
UTF8
(1 row)

schema=# SELECT * FROM table;
<EXPECTED DATA>

我做錯了什麼?

為克雷格編輯:

vagrant@precise32:~$ locale
LANG=en_CA.UTF-8
LANGUAGE=
LC_CTYPE="en_CA.UTF-8"
LC_NUMERIC="en_CA.UTF-8"
LC_TIME="en_CA.UTF-8"
LC_COLLATE="en_CA.UTF-8"
LC_MONETARY="en_CA.UTF-8"
LC_MESSAGES="en_CA.UTF-8"
LC_PAPER="en_CA.UTF-8"
LC_NAME="en_CA.UTF-8"
LC_ADDRESS="en_CA.UTF-8"
LC_TELEPHONE="en_CA.UTF-8"
LC_MEASUREMENT="en_CA.UTF-8"
LC_IDENTIFICATION="en_CA.UTF-8"
LC_ALL=

psql``client_encodingLC_CTYPE環境中的變數中檢測;如果未設置,則返回到LC_ALL然後。LANG

在您要啟動的終端psql中,執行locale. 例如

$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

將結果粘貼為您的問題的編輯。我強烈懷疑您的終端語言環境將是en_CA,不是en_CA.UTF-8

引用自:https://dba.stackexchange.com/questions/58148