Postgresql
Postgres 客戶端無法檢測到 UTF-8 數據庫
語境
我正在為我的開發團隊部署一個 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_encoding
從LC_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
。