2010年4月26日 星期一

Client Encoding, PostgreSQL開放性的亮點

client encoding 這個東西,實在是PostgreSQL開放性的一個亮點。

簡單講,資料庫與客戶端的文字編碼,不見得需要一致。相信開發者都曾經碰過,需要同時服務中國與台灣使用者的狀況,中國使用者輸入的是GB編碼的簡體,台灣使用者輸入的是BIG5編碼的繁體中文,兩者的資料都存入UTF8編碼的資料庫中。

在這種狀況下,開發Web版的程式還算簡單,但如果是開發AP版的程式,那就真得有點欲哭無淚了。

在PostgreSQL的使用手冊,第二十二章中有提到Localization,它提出了資料庫伺服端和程式客戶端文字編碼的說明,並支援一些常見的搭配組合。

使用上
1 .使用psql
以下列形式的指令,進行客戶端編碼設定

\encoding BIG5

2. 在程式中,下SQL指令換編碼

SET CLIENT_ENCODING TO 'value';
顯示現在的客戶端文字編碼
SHOW client_encoding;
取得系統預設的文字編碼
RESET client_encoding;



以我個人的使用經驗來看,資料庫的編碼最好使用UTF8,之前使用的EUC_TW, BIG5, MULE_INTERNAL等,現在完全可以放棄了。


1 則留言:

  1. Jeff大哥您好,想請教一個 postgreSQL 問題.

    小弟環境為以下
    OS:Windows 2003 server
    SQL:PostgreSQL 9.0
    db name:postgres (UTF-8)

    需要將以tab作分隔符號的文字檔,轉入一張資料表中
    因為文字檔中有中文字, 所以先將文字檔通過 java 的 native2ascii 處理,所有中文轉成以\u9834\u4398 字樣 (當然該文字檔也是 UTF-8).

    在 psql 中再用以下語法作匯入
    COPY mytable FROM 'D://test.txt' WITH DELIMITER AS ' ';

    資料是成功轉入了,但是問題來了
    以 postgresql 的查詢工具查詢欄位內容, 中文字則變成 u9834u4398
    而非原來的中文字, 不知為什麼 "\"符號也消失了, 這是為什麼呢?

    但是小弟以 JSP 透過 JDBC 插入資料,語法如下:
    INSERT INTO test(aa,bb)VALUES('\u9834','\u4398 ')
    再以 postgresql 的查詢工具查, 結果中文可以正常顯示.
    是 JDBC 有對一些編碼作處理, 但 COPY..FROM 卻沒有嗎?

    試了近一個星期也查了網路許多資料都找不到解決方法.請Jeff大哥指示.
    感激不盡!

    p.s 您可以直接回覆在文章,我都會過來看您文章,謝謝!

    回覆刪除