postgresql8.4的編碼設置

雖然官方文檔有提到編碼的問題,可是對於中文講的比較簡單,給中文的PostgreSQL用戶帶來不少困擾,本文簡單簡述一下中文環境下PostgreSQL如何正確設置編碼。sql

1、服務器端的編碼設置數據庫

PostgreSQL在服務器端只支持兩種簡體中文編碼: EUC_CN和UTF-8,而因爲windows不支持EUC因此,在windows環境底下只能選UTF-8。windows

1. 安裝時的編碼設置服務器

1.1 Linux下的中文編碼設置ide

設置爲EUC_CN函數

[localhost ~]$ initdb -E EUC_CN -D data7 --locale=zh_CNpost

設置爲UTF-8測試

[galy@localhost ~]$ initdb -E UTF-8 -D data7 --locale=zh_CN.UTF-8ui

1.2 Windows下的中文編碼設置this

設置爲UTF-8

initdb.exe -E UTF8  -D c:\data3  --locale=chinese

2. 常見的問題:

2.1 不支持的服務器編碼

若是環境的默認編碼是PostgreSQL不支持的話,初始化的時候會報錯,以下面環境的中文編碼爲GBK,而PG不支持GBK,因此報錯。

[localhost ~]$ export LANG=zh_CN.gbk

[localhost ~]$ initdb -D testencoding

The database cluster will be initialized with locale zh_CN.gbk.

initdb: locale zh_CN.gbk requires unsupported encoding GBK

Encoding GBK is not allowed as a server-side encoding.

Rerun initdb with a different locale selection.

2.2 locale和編碼有衝突

若是指定的locale和編碼格式有衝突,一樣也會報錯。解決的方即是,指定編碼兼容的locale.

[localhost ~]$ locale

LANG=zh_CN.gbk

LC_CTYPE="zh_CN.gbk"

默認的locale是中文gbk, 而下面的編碼確實EUC_CN,於是系統報錯,解決的方法是,指定--locale=zh_CN

[localhost ~]$ initdb -E EUC_CN -D data6

The files belonging to this database system will be owned by user "galy".

This user must also own the server process.

The database cluster will be initialized with locale zh_CN.gbk.

initdb: encoding mismatch

The encoding you selected (EUC_CN) and the encoding that the

selected locale uses (GBK) do not match.  This would lead to

misbehavior in various character string processing functions.

Rerun initdb and either do not specify an encoding explicitly,

or choose a matching combination.

initdb: 警告: 編碼不匹配

您選擇的編碼 (EUC_CN) 和所選擇的語言環境使用的編碼 (GBK) 不匹配的.

這樣將致使處理不一樣字符串的函數時產生錯誤.

要修復此問題, 從新運行 initdb 而且不要明確指定編碼, 或者先選擇一個匹配

組合類型.

2、客戶端的編碼

雖然PG支持客戶端和服務器端的編碼自動轉換,可是還須要聽從一個原則:本地環境的編碼和客戶端編碼需一致。不然將會出現亂碼或者是其餘問題。

本地環境的編碼爲GBK

C:\Program Files\PostgreSQL\9.1\bin>chcp

活動代碼頁: 936

數據庫的編碼爲UTF8

=#\t

Name              | lenovo

Owner             | lenovo

Encoding          | UTF8

Collate           | Chinese (Simplified)_People's Republic of China.936

Ctype             | Chinese (Simplified)_People's Republic of China.936

Access privileges |

客戶端編碼爲GBK

lenovo=# \encoding

GBK

如今本地環境和客戶端編碼都是GBK,因此沒有問題

客戶端輸入的GBK字符,會自動轉化爲UTF-8

lenovo=# insert into test values('測試');

INSERT 0 1

服務器端的UTF-8編碼,傳到客戶端時候,也會自動轉換編碼爲GBK:

lenovo=# select * from test;

 name

------

 測試

(1 row)

若是客戶端設置爲UTF-8的話,和本地環境的GBK不一致則會出現問題

lenovo=# \encoding UTF-8

因爲客戶端編碼和服務器端一致,爲UTF-8,因此不轉換傳到客戶端,而操做系統把它看成GBK顯示,因此顯示亂碼:

lenovo=# select * from test;

 name

------

 嫺嬭瘯

(1 row)

而插入的字符則直接以GBK編碼的形式傳到服務器端,服務器端認識不了,因此報錯。

lenovo=# insert into test values('測試');

ERROR:  invalid byte sequence for encoding "UTF8": 0xb2

ERROR:  invalid byte sequence for encoding "UTF8": 0xb2

輸入和顯示都有問題,這是由於若是客戶端和服務器的編碼都一致的話,則不進行轉碼,而輸入是按照本地環境的GBK進行編碼,GBK的編碼進入UTF-8的庫固然會有問題。

3、顯示信息的中文話

PostgreSQL支持多語言顯示提示信息,若是但願服務器端及客戶端的提示信息爲中文,還須要進行一些額外的設置。

首先, 編譯的時候須要加上天然語言支持模塊

./configure --enable-nls

其次,在參數配置文件postgresql.conf設置信息爲中文

lc_messages = 'zh_CN'                     # locale for system error message

這樣在服務器端和客戶端的提示信息都顯示爲中文

[localhost ~]$

日誌:  已啓動autovacuum

日誌:  數據庫系統準備接受鏈接

# dsd;

錯誤:  語法錯誤 在 "dsd" 或附近的 第 1 個字符處

語句:  dsd;

錯誤:  語法錯誤 在 "dsd" 或附近的

相關文章
相關標籤/搜索