| PostgreSQL 8.0.0 中文文件(轉譯自 PostgreSQL 中國 製作的簡體中文版本) | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 20. 區域 | Fast Forward | Next |
PostgreSQL 裡面的字元集支援您能夠以各種字元集儲存文本, 包括單字元的字元集,比如 ISO 8859 系列和 EUC (擴展 Unix 編碼 Extended Unix Code),Unicode 和 Mule 國際編碼。所有字元集都可以在伺服器上透明地使用。 (如果您使用了來自其它資料源地擴展函數,那麼它取決於他們是否正確地書寫了代碼。) 預設的字元集是在使用 initdb 初始化您的 PostgreSQL 資料庫集群的時候選擇的。 在您的使用 createdb 或者 SQL 命令 CREATE DATABASE 的時候是可以覆蓋這個預設的。因此,您可以有多個資料庫,每個都有不同的字元集。
Table 20-1 顯示了可以用在伺服器的字元集。
Table 20-1. 伺服器字元集
| 名字 | 描述 |
|---|---|
| SQL_ASCII | ASCII |
| EUC_JP | 日文 EUC |
| EUC_CN | 中文 EUC |
| EUC_KR | 韓文 EUC |
| JOHAB | 韓文 EUC (Hangle base) |
| EUC_TW | 台灣 EUC |
| UNICODE | Unicode(UTF-8) |
| MULE_INTERNAL | Mule 內部編碼 |
| LATIN1 | ISO 8859-1/ECMA 94 (Latin Alphabet No.1) |
| LATIN2 | ISO 8859-2/ECMA 94 (Latin Alphabet No.2) |
| LATIN3 | ISO 8859-3/ECMA 94 (Latin Alphabet No.3) |
| LATIN4 | ISO 8859-4/ECMA 94 (Latin Alphabet No.4) |
| LATIN5 | ISO 8859-9/ECMA 128 (Latin Alphabet No.5) |
| LATIN6 | ISO 8859-10/ECMA 144 (Latin Alphabet No.6) |
| LATIN7 | ISO 8859-13 (Latin Alphabet no.7) |
| LATIN8 | ISO 8859-14 (Latin Alphabet no.8) |
| LATIN9 | ISO 8859-15 (Latin Alphabet no.9) |
| LATIN10 | ISO 8859-16/ASRO SR 14111 (Latin Alphabet no.10) |
| ISO_8859_5 | ISO 8859-5/ECMA 113 (Latin/Cyrillic) |
| ISO_8859_6 | ISO 8859-6/ECMA 114 (Latin/Arabic) |
| ISO_8859_7 | ISO 8859-7/ECMA 118 (Latin/Greek) |
| ISO_8859_8 | ISO 8859-8/ECMA 121 (Latin/Hebrew) |
| KOI8 | KOI8-R(U) |
| ALT | Windows CP866 |
| WIN874 | Windows CP874 (Thai) |
| WIN1250 | Windows CP1250 |
| WIN | Windows CP1251 |
| WIN1256 | Windows CP1256 (Arabic) |
| TCVN | TCVN-5712/Windows CP1258 (Vietnamese) |
Important: 在 PostgreSQL7.2 之前, LATIN5錯誤地資料表示 ISO 8859-5 的意思。 從 7.2 開始 LATIN5資料表示 ISO8859-9。 如果您有一個在 7.1 或者之前建立的使用了 LATIN5的資料庫, 而且您希望移植到 7.2(或者以後的版本), 那麼您必須非常仔細地注意這個變化。
並非所有API支援上面列出的編碼。比如, PostgreSQL JDBC 驅動就不支援MULE_INTERNAL, LATIN6,LATIN8 和 LATIN10。
initdb 為一個 PostgreSQL 集群定義預設的字元集,比如:
initdb -E EUC_JP
把預設字元集設置為 EUC_JP (用於日文的擴展的 Unix 編碼)。 如果您喜歡用長選項聲明的話,您可以用 --encoding 代替 -E。 如果沒有給出-E或者--encoding選項, 則使用SQL_ASCII。
您可以建立一個有著不同編碼的資料庫:
createdb -E EUC_KR korean
將建立一個使用EUC_KR字元集的名字叫 korean 的資料庫。 另外一種實現方法是使用 SQL 命令:
CREATE DATABASE korean WITH ENCODING 'EUC_KR';
資料庫的編碼是用系統資料表 pg_database 裡的一個 編碼字串代資料表的。 您可以用psql的-l選項或 \l命令列出這些編碼。
$ psql -l
List of databases
Database | Owner | Encoding
---------------+---------+---------------
euc_cn | t-ishii | EUC_CN
euc_jp | t-ishii | EUC_JP
euc_kr | t-ishii | EUC_KR
euc_tw | t-ishii | EUC_TW
mule_internal | t-ishii | MULE_INTERNAL
regression | t-ishii | SQL_ASCII
template1 | t-ishii | EUC_JP
test | t-ishii | EUC_JP
unicode | t-ishii | UNICODE
(9 rows)
Important: 雖然您可以給一個資料庫聲明您需要的任何編碼,但選擇一個與您選擇的區域不一致的編碼還是不妥的做法。 LC_COLLATE 和 LC_CTYPE 設置暗示一個特定的編碼, 與區域相關的操作(比如排序)在不兼容的編碼裡很有可能產生錯誤的解析。
因為這些區域設置都是由 initdb 凍結的, 所以在不同的資料庫裡使用不同的編碼更多是理論而不是現實。 這些機制很有可能在將來版本的 PostgreSQL 得到改進。
一個安全使用多種編碼的方法是在 initdb 的時候把區域設置為 C 或者 POSIX,這樣舊關閉了任何實際的區域敏感性。
PostgreSQL 支援一些編碼在伺服器和前端之間的自動編碼轉換。 轉換訊息在系統資料表 pg_conversion 中儲存。 您可以使用 SQL 命令 CREATE CONVERSION 建立一個新的轉換。 PostgreSQL帶著一些預定義的轉換。它們在 Table 20-2 中列出。
Table 20-2. 客戶/伺服器字元集轉換
| 伺服器字元集 | 可用客戶端字元集 |
|---|---|
| SQL_ASCII | SQL_ASCII, UNICODE, MULE_INTERNAL |
| EUC_JP | EUC_JP, SJIS, UNICODE, MULE_INTERNAL |
| EUC_CN | EUC_CN, UNICODE, MULE_INTERNAL |
| EUC_KR | EUC_KR, UNICODE, MULE_INTERNAL |
| JOHAB | JOHAB, UNICODE |
| EUC_TW | EUC_TW, BIG5, UNICODE, MULE_INTERNAL |
| LATIN1 | LATIN1, UNICODE, MULE_INTERNAL |
| LATIN2 | LATIN2, WIN1250, UNICODE, MULE_INTERNAL |
| LATIN3 | LATIN3, UNICODE, MULE_INTERNAL |
| LATIN4 | LATIN4, UNICODE, MULE_INTERNAL |
| LATIN5 | LATIN5, UNICODE |
| LATIN6 | LATIN6, UNICODE, MULE_INTERNAL |
| LATIN7 | LATIN7, UNICODE, MULE_INTERNAL |
| LATIN8 | LATIN8, UNICODE, MULE_INTERNAL |
| LATIN9 | LATIN9, UNICODE, MULE_INTERNAL |
| LATIN10 | LATIN10, UNICODE, MULE_INTERNAL |
| ISO_8859_5 | ISO_8859_5, UNICODE, MULE_INTERNAL, WIN, ALT, KOI8 |
| ISO_8859_6 | ISO_8859_6, UNICODE |
| ISO_8859_7 | ISO_8859_7, UNICODE |
| ISO_8859_8 | ISO_8859_8, UNICODE |
| UNICODE | EUC_JP, SJIS, EUC_KR, UHC, JOHAB, EUC_CN, GBK, EUC_TW, BIG5, LATIN1 到 LATIN10, ISO_8859_5, ISO_8859_6, ISO_8859_7, ISO_8859_8, WIN, ALT, KOI8, WIN1256, TCVN, WIN874, GB18030, WIN1250 |
| MULE_INTERNAL | EUC_JP, SJIS, EUC_KR, EUC_CN, EUC_TW, BIG5, LATIN1 到 LATIN5, WIN, ALT, WIN1250 BIG5, ISO_8859_5, KOI8 |
| KOI8 | ISO_8859_5, WIN, ALT, KOI8, UNICODE, MULE_INTERNAL |
| ALT | ISO_8859_5, WIN, ALT, KOI8, UNICODE, MULE_INTERNAL |
| WIN | ISO_8859_5, WIN, ALT, KOI8, UNICODE, MULE_INTERNAL |
| WIN874 | WIN874, UNICODE |
| WIN1250 | LATIN2, WIN1250, UNICODE, MULE_INTERNAL |
| WIN | ISO_8859_5, WIN, ALT, KOI8, UNICODE, MULE_INTERNAL |
| WIN1256 | WIN1256, UNICODE |
| TCVN | TCVN, UNICODE |
要想打開自動字元集轉換功能,您必須告訴 PostgreSQL 您想在客戶端使用的字元集(編碼)。您可以用好幾種方法實現這個目的。
用 psql 裡的 \encoding 命令。 \encoding 允許您動態修改客戶端編碼。 比如,把編碼改變為 SJIS,鍵入:
\encoding SJIS
使用 libpq 函數。 \encoding 在做此用途的時候實際上是調用 PQsetClientEncoding()。
int PQsetClientEncoding(PGconn *conn, const char *encoding);
這裡 conn 與後端的連線,而 encoding 是您想用的編碼。如果編碼設置成功它返回 0,否則返回 -1。本次連線的目前編碼可以用下面函數顯示:
int PQclientEncoding(const PGconn *conn);
請注意它只返回編碼 ID,而不是象 EUC_JP 這樣的編碼符號字串。 要把編碼 ID 轉換為編碼符號,您可以用:
char *pg_encoding_to_char(int encoding_id);
使用 SET client_encoding TO。 可以用 SQL 命令設置客戶端編碼:
SET CLIENT_ENCODING TO 'value';
您還可以把 SQL 語法裡的 SET NAMES用於這個目的:
SET NAMES 'value';
查詢目前客戶端編碼:
SHOW client_encoding;
返回預設編碼:
RESET client_encoding;
使用 PGCLIENTENCODING。 如果在客戶端的環境裡定義了 PGCLIENTENCODING 環境變量, 那麼在與伺服器進行連線時將自動選擇客戶端編碼。 (這個編碼隨後可以用上面談到的任何其它方法覆蓋。)
使用client_encoding配置變量。 如果在 postgresql.conf 裡設置了 client_encoding 變量, 那麼在與伺服器建立了連線之後,這個客戶端編碼將自動選定。(這個設置隨後可以被上面提到 的其他方法覆蓋。)
假如無法進行特定的字元轉換 — 比如, 您選的伺服器編碼是EUC_JP, 客戶端是LATIN1,那麼有些日文字元不能轉換成LATIN1。這時, 不能用LATIN1字元集資料表示的字母將被轉換成圓括弧包圍的十六進制,像,(826C) 這樣。
下面是學習各種類型的編碼系統的好地方。
詳細地解釋了第3.2節出現的EUC_JP, EUC_CN,EUC_KR,EUC_TW。
Unicode 的家目錄。
定義了UTF-8。