| PostgreSQL 7.4 文檔 | ||||
|---|---|---|---|---|
| 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 | US 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 | ECMA 113 (Latin/Cyrillic) |
| ISO_8859_6 | ECMA 114 (Latin/Arabic) |
| ISO_8859_7 | ECMA 118 (Latin/Greek) |
| ISO_8859_8 | ECMA 121 (Latin/Hebrew) |
| KOI8 | KOI8-R(U) |
| WIN | Windows CP1251 |
| ALT | Windows CP866 |
| WIN1256 | Windows CP1256 (Arabic) |
| TCVN | TCVN-5712/Windows CP1258 (Vietnamese) |
| WIN874 | Windows CP874 (Thai) |
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)
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 to 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 |
| WIN | ISO_8859_5, WIN, ALT, KOI8, UNICODE, MULE_INTERNAL |
| ALT | ISO_8859_5, WIN, ALT, KOI8, UNICODE, MULE_INTERNAL |
| WIN1256 | WIN1256, UNICODE |
| TCVN | TCVN, UNICODE |
| WIN874 | WIN874, 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.