?
Ce document utilise Manuel du site Web PHP chinois Libérer
PostgreSQL 能夠以各種字符集存儲(chǔ)文本, 比如 ISO-8859 系列和EUC(擴(kuò)展 Unix 編碼)、UTF-8 、Mule 國(guó)際編碼。 所有字符集都可以在服務(wù)器上透明地使用。 如果你使用了來(lái)自其它數(shù)據(jù)源的擴(kuò)展函數(shù), 那么它取決于他們是否正確地書寫了代碼。 缺省的字符集是在使用 initdb 初始化數(shù)據(jù)庫(kù)集群的時(shí)候選擇的。 在你創(chuàng)建數(shù)據(jù)庫(kù)的時(shí)候是可以覆蓋這個(gè)缺省的。 因此,你可以有多個(gè)數(shù)據(jù)庫(kù),每個(gè)都有不同的字符集。
An important restriction, however, is that each database's character set must be compatible with the database's LC_CTYPE (character classification) and LC_COLLATE (string sort order) locale settings. For C or POSIX locale, any character set is allowed, but for other locales there is only one character set that will work correctly. (On Windows, however, UTF-8 encoding can be used with any locale.)
一項(xiàng)重要的限制是每個(gè)數(shù)據(jù)庫(kù)的字節(jié)設(shè)置必須被數(shù)據(jù)庫(kù)的LC_CTYPE(字節(jié)分類)和 LC_COLLATE(字符串存儲(chǔ)命令)區(qū)域設(shè)置兼容。 對(duì)于C或者POSIX區(qū)域,任何字符設(shè)置都是被允許的,但是對(duì)于其它區(qū)域僅僅只可以設(shè)置一種字符才可以正常工作。 (在windows操作系統(tǒng),UTF-8編碼可以在任何一個(gè)區(qū)域使用。)
Table 22-1 顯示了可以用在 PostgreSQL上的編碼。
Table 22-1. PostgreSQL服務(wù)器字符集
名稱 | 描述 | 語(yǔ)言 | 服務(wù)端 | 字節(jié)/字符 | 別名 |
---|---|---|---|---|---|
BIG5 | 大五碼 | 繁體中文 | No | 1-2 | WIN950, Windows950 |
EUC_CN | 拓展UNIX代碼——Cn | 簡(jiǎn)體中文 | Yes | 1-3 | ? |
EUC_JP | 擴(kuò)展UNIX代碼-JP | 日文 | Yes | 1-3 | ? |
EUC_JIS_2004 | 擴(kuò)展UNIX代碼-JP,JIS x 0213 | 日文 | Yes | 1-3 | ? |
EUC_KR | 擴(kuò)展UNIX代碼-KR | 韓文 | Yes | 1-3 | ? |
EUC_TW | 擴(kuò)展UNIX代碼-TW | 繁體中文,臺(tái)灣 | Yes | 1-3 | ? |
GB18030 | 國(guó)標(biāo)碼 | 中文 | No | 1-2 | ? |
GBK | 擴(kuò)展國(guó)標(biāo)碼 | 簡(jiǎn)體中文 | No | 1-2 | WIN936, Windows936 |
ISO_8859_5 | ISO 8859-5, ECMA 113 | 拉丁/西里爾語(yǔ) | Yes | 1 | ? |
ISO_8859_6 | ISO 8859-6, ECMA 114 | 拉丁/阿拉伯語(yǔ) | Yes | 1 | ? |
ISO_8859_7 | ISO 8859-7, ECMA 118 | 拉丁/希臘語(yǔ) | Yes | 1 | ? |
ISO_8859_8 | ISO 8859-8, ECMA 121 | 拉丁/希伯萊語(yǔ) | Yes | 1 | ? |
JOHAB | JOHAB | 韓語(yǔ) | No | 1-3 | ? |
KOI8R | KOI8-R | 西里爾語(yǔ) | Yes | 1 | KOI8 |
KOI8U | KOI8-U | 烏克蘭語(yǔ) | Yes | 1 | ? |
LATIN1 | ISO 8859-1, ECMA 94 | 西歐語(yǔ) | Yes | 1 | ISO88591 |
LATIN2 | ISO 8859-2, ECMA 94 | 中歐語(yǔ) | Yes | 1 | ISO88592 |
LATIN3 | ISO 8859-3, ECMA 94 | 南歐語(yǔ) | Yes | 1 | ISO88593 |
LATIN4 | ISO 8859-4, ECMA 94 | 北歐語(yǔ) | Yes | 1 | ISO88594 |
LATIN5 | ISO 8859-9, ECMA 128 | 土耳其語(yǔ) | Yes | 1 | ISO88599 |
LATIN6 | ISO 8859-10, ECMA 144 | 日耳曼語(yǔ) | Yes | 1 | ISO885910 |
LATIN7 | ISO 8859-13 | 波羅的海語(yǔ) | Yes | 1 | ISO885913 |
LATIN8 | ISO 8859-14 | 凱爾特語(yǔ) | Yes | 1 | ISO885914 |
LATIN9 | ISO 8859-15 | 帶有歐洲語(yǔ)系和語(yǔ)調(diào)的 LATIN1 | Yes | 1 | ISO885915 |
LATIN10 | ISO 8859-16, ASRO SR 14111 | 羅馬尼亞語(yǔ) | Yes | 1 | ISO885916 |
MULE_INTERNAL | 國(guó)際編碼 | 多語(yǔ)種 Emacs | Yes | 1-4 | ? |
SJIS | Shift JIS | 日語(yǔ) | No | 1-2 | Mskanji, ShiftJIS, WIN932, Windows932 |
SHIFT_JIS_2004 | Shift JIS, JIS X 0213 | 日語(yǔ) | No | 1-2 | ? |
SQL_ASCII | 未聲明(見(jiàn)文本) | 任意 | Yes | 1 | ? |
UHC | 統(tǒng)一韓語(yǔ)編碼 | 韓語(yǔ) | No | 1-2 | WIN949, Windows949 |
UTF8 | Unicode, 8-bit | 全部 | Yes | 1-4 | Unicode |
WIN866 | Windows CP866 | 西里爾語(yǔ) | Yes | 1 | ALT |
WIN874 | Windows CP874 | 泰國(guó)語(yǔ) | Yes | 1 | ? |
WIN1250 | Windows CP1250 | 中歐語(yǔ) | Yes | 1 | ? |
WIN1251 | Windows CP1251 | 西里爾語(yǔ) | Yes | 1 | WIN |
WIN1252 | Windows CP1252 | 西歐語(yǔ) | Yes | 1 | ? |
WIN1253 | Windows CP1253 | 希臘語(yǔ) | Yes | 1 | ? |
WIN1254 | Windows CP1254 | 土耳其語(yǔ) | Yes | 1 | ? |
WIN1255 | Windows CP1255 | 希伯來(lái)語(yǔ) | Yes | 1 | ? |
WIN1256 | Windows CP1256 | 阿拉伯語(yǔ) | Yes | 1 | ? |
WIN1257 | Windows CP1257 | 波羅的語(yǔ) | Yes | 1 | ? |
WIN1258 | Windows CP1258 | 越南語(yǔ) | Yes | 1 | ABC, TCVN, TCVN5712, VSCII |
并非所有的客戶端的 API都支持列出的編碼。例如 PostgreSQL JDBC 驅(qū)動(dòng) 就不支持 MULE_INTERNAL, LATIN6, LATIN8, and LATIN10。
SQL_ASCII 設(shè)置與其它設(shè)置表現(xiàn)得相當(dāng)不同。 如果服務(wù)器字符集是 SQL_ASCII, 服務(wù)器把字節(jié)值 0-127 的數(shù)值根據(jù) ASCII 標(biāo)準(zhǔn)解析 而字節(jié)值 128-255 的則當(dāng)作未解析的字符。 如果設(shè)置為SQL_ASCII. 就不會(huì)有編碼轉(zhuǎn)換。 因此,這個(gè)設(shè)置基本不用來(lái)聲明所使用的編碼,因?yàn)檫@個(gè)聲明會(huì)忽略編碼。 在大多數(shù)情況下,如果你使用了任何非 ASCII 數(shù)據(jù),那么使用 SQL_ASCII 設(shè)置都是不明智的,因?yàn)? PostgreSQL 會(huì)無(wú)法幫助你轉(zhuǎn)換或者校驗(yàn)非 ASCII 字符。
initdb 為一個(gè) PostgreSQL 集群定義缺省的字符集,比如:
initdb -E EUC_JP
把缺省字符集設(shè)置為 EUC_JP (用于日文的擴(kuò)展 Unix 編碼). 如果你喜歡用長(zhǎng)選項(xiàng)聲明的話,可以用 --encoding 代替 -E 選項(xiàng)。 如果沒(méi)有給出 -E 或者 --encoding 選項(xiàng) initdb 將基于制定的區(qū)域或者缺省區(qū)域試圖判斷合適的編碼。
在創(chuàng)建數(shù)據(jù)庫(kù)的時(shí)候你可以指定一個(gè)非默認(rèn)的編碼,提供適合所選區(qū)域的編碼:
createdb -E EUC_KR -T template0 --lc-collate=ko_KR.euckr --lc-ctype=ko_KR.euckr korean
創(chuàng)建一個(gè)叫做korean的數(shù)據(jù)庫(kù),使用字集EUC_KR和區(qū)域ko_KR, 另外一種實(shí)現(xiàn)方法是使用 SQL 命令:
CREATE DATABASE korean WITH ENCODING 'EUC_KR' LC_COLLATE='ko_KR.euckr' LC_CTYPE='ko_KR.euckr' TEMPLATE=template0;
注意:以上的命令指定復(fù)制數(shù)據(jù)庫(kù)template0。當(dāng)復(fù)制別的數(shù)據(jù)庫(kù)時(shí),編碼和別的區(qū)域化設(shè)置不能從源數(shù)據(jù)庫(kù)內(nèi)被改變,因?yàn)? 結(jié)果可能是錯(cuò)誤的數(shù)據(jù)。更多的說(shuō)明請(qǐng)參考Section 21.3。
數(shù)據(jù)庫(kù)的編碼是存儲(chǔ)在 pg_database系統(tǒng)表中的。你可以用 psql 的-l 選項(xiàng)或者 \l列出這些編碼.
$ psql -l List of databases Name | Owner | Encoding | Collation | Ctype | Access Privileges -----------+----------+-----------+-------------+-------------+------------------------------------- clocaledb | hlinnaka | SQL_ASCII | C | C | englishdb | hlinnaka | UTF8 | en_GB.UTF8 | en_GB.UTF8 | japanese | hlinnaka | UTF8 | ja_JP.UTF8 | ja_JP.UTF8 | korean | hlinnaka | EUC_KR | ko_KR.euckr | ko_KR.euckr | postgres | hlinnaka | UTF8 | fi_FI.UTF8 | fi_FI.UTF8 | template0 | hlinnaka | UTF8 | fi_FI.UTF8 | fi_FI.UTF8 | {=c/hlinnaka,hlinnaka=CTc/hlinnaka} template1 | hlinnaka | UTF8 | fi_FI.UTF8 | fi_FI.UTF8 | {=c/hlinnaka,hlinnaka=CTc/hlinnaka} (7 rows)
Important: 在大多數(shù)現(xiàn)代的操作系統(tǒng)中,PostgreSQL可以決定 哪個(gè)字符集被LC_CTYPE設(shè)置,它會(huì)在匹配數(shù)據(jù)庫(kù)編碼時(shí)運(yùn)行。 在比較老的操作系統(tǒng)上,你的任務(wù)是保證你用到的編碼是你選擇的區(qū)域所預(yù)期的。這個(gè)區(qū)域的 的一個(gè)錯(cuò)誤可能會(huì)導(dǎo)致locale-dependent的錯(cuò)誤行為。
PostgreSQL將會(huì)允許超級(jí)用戶用SQL_ASCII編碼創(chuàng)建數(shù)據(jù)庫(kù),即使 LC_CTYPE不是C或POSIX。就像上面注意到的, SQL_ASCII不執(zhí)行那些在數(shù)據(jù)庫(kù)里有特別編碼的數(shù)據(jù)存儲(chǔ),這個(gè)選擇構(gòu)成locale-dependent發(fā)生錯(cuò)誤行為的風(fēng)險(xiǎn)。 使用這些組合的設(shè)置已經(jīng)過(guò)時(shí),或者某一天可能被禁止。
PostgreSQL 支持在服務(wù)器和前端之間的自動(dòng)編碼轉(zhuǎn)換。 轉(zhuǎn)換信息在系統(tǒng)表pg_conversion中存儲(chǔ)。 PostgreSQL帶著一些預(yù)定義的轉(zhuǎn)換。 它們?cè)赥able 22-2中列出。 你可以使用 SQL 命令CREATE CONVERSION創(chuàng)建一個(gè)新的轉(zhuǎn)換。
Table 22-2. 客戶/服務(wù)器字符集轉(zhuǎn)換
服務(wù)器字符集 | 可用客戶端字符集 |
---|---|
BIG5 | 不支持做服務(wù)器端編碼 |
EUC_CN | EUC_CN, MULE_INTERNAL, UTF8 |
EUC_JP | EUC_JP, MULE_INTERNAL, SJIS, UTF8 |
EUC_KR | EUC_KR, MULE_INTERNAL, UTF8 |
EUC_TW | EUC_TW, BIG5, MULE_INTERNAL, UTF8 |
GB18030 | 不支持做服務(wù)器端編碼 |
GBK | 不支持做服務(wù)器端編碼 |
ISO_8859_5 | ISO_8859_5, KOI8R, MULE_INTERNAL, UTF8, WIN866, WIN1251 |
ISO_8859_6 | ISO_8859_6, UTF8 |
ISO_8859_7 | ISO_8859_7, UTF8 |
ISO_8859_8 | ISO_8859_8, UTF8 |
JOHAB | JOHAB, UTF8 |
KOI8R | KOI8R, ISO_8859_5, MULE_INTERNAL, UTF8, WIN866, WIN1251 |
KOI8U | KOI8U, UTF8 |
LATIN1 | LATIN1, MULE_INTERNAL, UTF8 |
LATIN2 | LATIN2, MULE_INTERNAL, UTF8, WIN1250 |
LATIN3 | LATIN3, MULE_INTERNAL, UTF8 |
LATIN4 | LATIN4, MULE_INTERNAL, UTF8 |
LATIN5 | LATIN5, UTF8 |
LATIN6 | LATIN6, UTF8 |
LATIN7 | LATIN7, UTF8 |
LATIN8 | LATIN8, UTF8 |
LATIN9 | LATIN9, UTF8 |
LATIN10 | LATIN10, UTF8 |
MULE_INTERNAL | MULE_INTERNAL, BIG5, EUC_CN, EUC_JP, EUC_KR, EUC_TW, ISO_8859_5, KOI8R, LATIN1 to LATIN4, SJIS, WIN866, WIN1250, WIN1251 |
SJIS | 不支持做服務(wù)器端編碼 |
SQL_ASCII | 任意(不會(huì)發(fā)生編碼轉(zhuǎn)換) |
UHC | 不支持做服務(wù)器端編碼 |
UTF8 | 所有支持的編碼 |
WIN866 | WIN866, ISO_8859_5, KOI8R, MULE_INTERNAL, UTF8, WIN1251 |
WIN874 | WIN874, UTF8 |
WIN1250 | WIN1250, LATIN2, MULE_INTERNAL, UTF8 |
WIN1251 | WIN1251, ISO_8859_5, KOI8R, MULE_INTERNAL, UTF8, WIN866 |
WIN1252 | WIN1252, UTF8 |
WIN1253 | WIN1253, UTF8 |
WIN1254 | WIN1254, UTF8 |
WIN1255 | WIN1255, UTF8 |
WIN1256 | WIN1256, UTF8 |
WIN1257 | WIN1257, UTF8 |
WIN1258 | WIN1258, UTF8 |
要想打開(kāi)自動(dòng)字符集轉(zhuǎn)換功能,你必須告訴PostgreSQL你想在客戶端使用的字符集(編碼)。你可以用好幾種方法實(shí)現(xiàn)這個(gè)目的。
用psql里的\encoding 命令\encoding允許你動(dòng)態(tài)修改客戶端編碼。 比如,把編碼改變?yōu)?tt class="LITERAL">SJIS 鍵入:
\encoding SJIS
libpq (Section 31.9) has functions to control the client encoding.
使用libpq (Section 31.9) 具有控制客戶端編碼的功能。
使用 SET client_encoding TO. 設(shè)置客戶端編碼:
SET CLIENT_ENCODING TO 'value';
你還可以把 SQL 語(yǔ)法里的x SET NAMES 用于這個(gè)目的:
SET NAMES 'value';
查詢當(dāng)前客戶端編碼:
SHOW client_encoding;
返回缺省編碼:
RESET client_encoding;
使用 PGCLIENTENCODING. 如果在客戶端的環(huán)境里定義了 PGCLIENTENCODING 環(huán)境變量,那么在與服務(wù)器進(jìn)行連接時(shí)將自動(dòng)選擇客戶端編碼。這個(gè)編碼隨后可以用上面談到的任何其它方法覆蓋。
使用 client_encoding配置變量。 如果在client_encoding 里設(shè)置了該變量, 那么在與服務(wù)器建立了連接之后,這個(gè)客戶端編碼將自動(dòng)選定。這個(gè)設(shè)置隨后可以被上面提到的其它方法覆蓋。
假如無(wú)法進(jìn)行特定的字符轉(zhuǎn)換,比如,你選的服務(wù)器編碼是EUC_JP 而客戶端是LATIN1 那么有些日文字符不能轉(zhuǎn)換成 LATIN1; 這時(shí)將報(bào)告錯(cuò)誤。
如果客戶端字符集定義成了SQL_ASCII, 那么編碼轉(zhuǎn)換會(huì)被關(guān)閉,不管服務(wù)器的字符集是什么都一樣。和服務(wù)器一樣,除非你的工作環(huán)境全部是 ASCII 數(shù)據(jù),否則使用 SQL_ASCII is unwise是不明智的。
下面是學(xué)習(xí)各種類型的編碼系統(tǒng)的好地方。
一整套有關(guān)字符集,編碼以及代碼頁(yè)的文檔。
詳細(xì)地解釋了第3.2節(jié)出現(xiàn)的 EUC_JP, EUC_CN, EUC_KR, EUC_TW編碼。
Unicode的主頁(yè)。
UTF-8 的定義