2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: 開發版
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

23.3. 字元集支援 #

PostgreSQL 的字元集支援允許您以多種字元集(也稱為編碼)儲存文字,包括單位元組字元集,例如 ISO 8859 系列,以及多位元組字元集,例如EUC(擴充套件 Unix 程式碼)、UTF-8 和 Mule 內部程式碼。所有支援的字元集都可以被客戶端透明地使用,但有少數不支援在伺服器內部使用(即作為伺服器端編碼)。預設字元集是在使用 initdb 初始化您的 PostgreSQL 資料庫叢集時選定的。可以在建立資料庫時覆蓋此設定,因此您可以擁有多個具有不同字元集的資料庫。

然而,一個重要的限制是,每個資料庫的字元集必須與資料庫的 LC_CTYPE(字元分類)和 LC_COLLATE(字串排序順序)區域設定相容。對於 CPOSIX 區域設定,任何字元集都允許使用,但對於其他 libc 提供的區域設定,只有一個字元集能夠正常工作。(但在 Windows 上,UTF-8 編碼可以與任何區域設定一起使用。)如果您配置了 ICU 支援,則 ICU 提供的區域設定可以與大多數(但並非所有)伺服器端編碼一起使用。

23.3.1. 支援的字元集 #

表 23.3 顯示了 PostgreSQL 中可用的字元集。

表 23.3. PostgreSQL 字元集

名稱 描述 語言 伺服器? ICU? 位元組/字元 別名
BIG5 Big Five 繁體中文 1–2 WIN950, Windows950
EUC_CN 擴充套件 UNIX 程式碼-CN 簡體中文 1–3  
EUC_JP 擴充套件 UNIX 程式碼-JP 日文 1–3  
EUC_JIS_2004 擴充套件 UNIX 程式碼-JP, JIS X 0213 日文 1–3  
EUC_KR 擴充套件 UNIX 程式碼-KR 韓文 1–3  
EUC_TW 擴充套件 UNIX 程式碼-TW 繁體中文,臺灣 1–4  
GB18030 國家標準 中文 1–4  
GBK 擴充套件國家標準 簡體中文 1–2 WIN936, Windows936
ISO_8859_5 ISO 8859-5,ECMA 113 拉丁語/西里爾語 1  
ISO_8859_6 ISO 8859-6,ECMA 114 拉丁語/阿拉伯語 1  
ISO_8859_7 ISO 8859-7,ECMA 118 拉丁語/希臘語 1  
ISO_8859_8 ISO 8859-8,ECMA 121 拉丁語/希伯來語 1  
JOHAB JOHAB 韓語(Hangul) 1–3  
KOI8R KOI8-R 西里爾語(俄語) 1 KOI8
KOI8U KOI8-U 西里爾語(烏克蘭語) 1  
LATIN1 ISO 8859-1,ECMA 94 西歐 1 ISO88591
LATIN2 ISO 8859-2,ECMA 94 中歐 1 ISO88592
LATIN3 ISO 8859-3,ECMA 94 南歐 1 ISO88593
LATIN4 ISO 8859-4,ECMA 94 北歐 1 ISO88594
LATIN5 ISO 8859-9,ECMA 128 土耳其語 1 ISO88599
LATIN6 ISO 8859-10,ECMA 144 北歐 1 ISO885910
LATIN7 ISO 8859-13 波羅的海 1 ISO885913
LATIN8 ISO 8859-14 凱爾特 1 ISO885914
LATIN9 ISO 8859-15 LATIN1,帶歐元和重音符號 1 ISO885915
LATIN10 ISO 8859-16,ASROSR 14111 羅馬尼亞語 1 ISO885916
MULE_INTERNAL Mule 內部程式碼 多語言 Emacs 1–4  
SJIS Shift JIS 日文 1–2 Mskanji, ShiftJIS, WIN932, Windows932
SHIFT_JIS_2004 Shift JIS, JIS X 0213 日文 1–2  
SQL_ASCII 未指定(參見文字) 任意 1  
UHC 統一韓文程式碼 韓文 1–2 WIN949, Windows949
UTF8 Unicode, 8 位 所有 1–4 Unicode
WIN866 Windows CP866 西里爾語 1 ALT
WIN874 Windows CP874 泰語 1  
WIN1250 Windows CP1250 中歐 1  
WIN1251 Windows CP1251 西里爾語 1 WIN
WIN1252 Windows CP1252 西歐 1  
WIN1253 Windows CP1253 希臘語 1  
WIN1254 Windows CP1254 土耳其語 1  
WIN1255 Windows CP1255 希伯來文 1  
WIN1256 Windows CP1256 阿拉伯語 1  
WIN1257 Windows CP1257 波羅的海 1  
WIN1258 Windows CP1258 越南語 1 ABC, TCVN, TCVN5712, VSCII

並非所有客戶端API都支援所有列出的字元集。例如,PostgreSQL JDBC 驅動程式不支援 MULE_INTERNALLATIN6LATIN8LATIN10

設定 SQL_ASCII 的行為與設定不同。當伺服器字元集為 SQL_ASCII 時,伺服器將位元組值 0-127 按 ASCII 標準解釋,而位元組值 128-255 被視為未解釋的字元。當設定為 SQL_ASCII 時,不會進行編碼轉換。因此,此設定與其說是宣告正在使用特定編碼,不如說是宣告對編碼一無所知。在大多數情況下,如果您使用任何非 ASCII 資料,使用 SQL_ASCII 設定是不明智的,因為 PostgreSQL 將無法透過轉換或驗證非 ASCII 字元來幫助您。

23.3.2. 設定字元集 #

initdb 定義了 PostgreSQL 叢集的預設字元集(編碼)。例如,

initdb -E EUC_JP

將預設字元集設定為 EUC_JP(日語擴充套件 Unix 程式碼)。如果您喜歡更長的選項字串,可以使用 --encoding 代替 -E。如果未提供 -E--encoding 選項,initdb 會嘗試根據指定的或預設的區域設定來確定要使用的合適編碼。

您可以在資料庫建立時指定一個非預設編碼,前提是該編碼與所選區域設定相容

createdb -E EUC_KR -T template0 --lc-collate=ko_KR.euckr --lc-ctype=ko_KR.euckr korean

這將建立一個名為 korean 的資料庫,使用 EUC_KR 字元集和 ko_KR 區域設定。另一種實現此目的的方法是使用此 SQL 命令

CREATE DATABASE korean WITH ENCODING 'EUC_KR' LC_COLLATE='ko_KR.euckr' LC_CTYPE='ko_KR.euckr' TEMPLATE=template0;

請注意,上述命令指定複製 template0 資料庫。複製任何其他資料庫時,編碼和區域設定不能從源資料庫更改,因為這可能會導致資料損壞。有關更多資訊,請參閱 第 22.3 節

資料庫的編碼儲存在系統目錄 pg_database 中。您可以使用 psql-l 選項或 \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)

重要提示

在大多數現代作業系統上,PostgreSQL 可以確定 LC_CTYPE 設定所暗示的字元集,並且它將強制只使用匹配的資料庫編碼。在舊系統上,您有責任確保使用所選區域設定所期望的編碼。此區域的錯誤很可能會導致依賴區域設定的操作(如排序)出現奇怪的行為。

PostgreSQL 允許超級使用者建立 SQL_ASCII 編碼的資料庫,即使 LC_CTYPE 不是 CPOSIX。如上所述,SQL_ASCII 不會強制資料庫中儲存的資料具有任何特定編碼,因此此選擇存在依賴區域設定的錯誤行為的風險。使用此設定組合已被棄用,並且將來可能會完全禁止。

23.3.3. 伺服器與客戶端之間的自動字元集轉換 #

PostgreSQL 支援伺服器和客戶端之間的自動字元集轉換,支援許多字元集組合(第 23.3.4 節 顯示了哪些字元集支援轉換)。

要啟用自動字元集轉換,您必須告知 PostgreSQL 您希望在客戶端使用的字元集(編碼)。有幾種方法可以實現這一點:

  • psql 中使用 \encoding 命令。\encoding 允許您動態更改客戶端編碼。例如,要將編碼更改為 SJIS,請鍵入:

    \encoding SJIS
    
  • libpq第 32.11 節)具有控制客戶端編碼的函式。

  • 使用 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。如果設定了 client_encoding 變數,則在與伺服器建立連線時會自動選擇該客戶端編碼。(隨後可以使用上述任何其他方法覆蓋此設定。)

如果無法轉換特定字元——假設您為伺服器選擇了 EUC_JP,為客戶端選擇了 LATIN1,並且返回了一些在 LATIN1 中沒有表示的日文字元——則會報告一個錯誤。

如果客戶端字元集設定為 SQL_ASCII,則無論伺服器字元集如何,編碼轉換都將被停用。(但是,如果伺服器的字元集不是 SQL_ASCII,伺服器仍然會檢查傳入資料是否對於該編碼有效;因此淨效應就像客戶端字元集與伺服器相同一樣。)就像對伺服器一樣,除非您處理的是全 ASCII 資料,否則使用 SQL_ASCII 是不明智的。

23.3.4. 可用的字元集轉換 #

PostgreSQL 允許在 pg_conversion 系統目錄中列出了轉換函式的任何兩個字元集之間進行轉換。PostgreSQL 附帶了一些預定義的轉換,如 表 23.4 中所述,並在 表 23.5 中更詳細地顯示。您可以使用 SQL 命令 CREATE CONVERSION 建立新的轉換。(為了用於自動客戶端/伺服器轉換,轉換必須被標記為其字元集對的“預設”。)

表 23.4. 內建客戶端/伺服器字元集轉換

伺服器字元集 可用的客戶端字元集
BIG5 不支援作為伺服器編碼
EUC_CN EUC_CN, MULE_INTERNAL, UTF8
EUC_JP EUC_JP, MULE_INTERNAL, SJIS, UTF8
EUC_JIS_2004 EUC_JIS_2004, SHIFT_JIS_2004, UTF8
EUC_KR EUC_KR, MULE_INTERNAL, UTF8
EUC_TW EUC_TW, BIG5, MULE_INTERNAL, UTF8
GB18030 不支援作為伺服器編碼
GBK 不支援作為伺服器編碼
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 不支援作為伺服器編碼
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, LATIN1LATIN4, SJIS, WIN866, WIN1250, WIN1251
SJIS 不支援作為伺服器編碼
SHIFT_JIS_2004 不支援作為伺服器編碼
SQL_ASCII 任意(不執行轉換)
UHC 不支援作為伺服器編碼
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

表 23.5. 所有內建字元集轉換

轉換名稱 [a] 源編碼 目標編碼
big5_to_euc_tw BIG5 EUC_TW
big5_to_mic BIG5 MULE_INTERNAL
big5_to_utf8 BIG5 UTF8
euc_cn_to_mic EUC_CN MULE_INTERNAL
euc_cn_to_utf8 EUC_CN UTF8
euc_jp_to_mic EUC_JP MULE_INTERNAL
euc_jp_to_sjis EUC_JP SJIS
euc_jp_to_utf8 EUC_JP UTF8
euc_kr_to_mic EUC_KR MULE_INTERNAL
euc_kr_to_utf8 EUC_KR UTF8
euc_tw_to_big5 EUC_TW BIG5
euc_tw_to_mic EUC_TW MULE_INTERNAL
euc_tw_to_utf8 EUC_TW UTF8
gb18030_to_utf8 GB18030 UTF8
gbk_to_utf8 GBK UTF8
iso_8859_10_to_utf8 LATIN6 UTF8
iso_8859_13_to_utf8 LATIN7 UTF8
iso_8859_14_to_utf8 LATIN8 UTF8
iso_8859_15_to_utf8 LATIN9 UTF8
iso_8859_16_to_utf8 LATIN10 UTF8
iso_8859_1_to_mic LATIN1 MULE_INTERNAL
iso_8859_1_to_utf8 LATIN1 UTF8
iso_8859_2_to_mic LATIN2 MULE_INTERNAL
iso_8859_2_to_utf8 LATIN2 UTF8
iso_8859_2_to_windows_1250 LATIN2 WIN1250
iso_8859_3_to_mic LATIN3 MULE_INTERNAL
iso_8859_3_to_utf8 LATIN3 UTF8
iso_8859_4_to_mic LATIN4 MULE_INTERNAL
iso_8859_4_to_utf8 LATIN4 UTF8
iso_8859_5_to_koi8_r ISO_8859_5 KOI8R
iso_8859_5_to_mic ISO_8859_5 MULE_INTERNAL
iso_8859_5_to_utf8 ISO_8859_5 UTF8
iso_8859_5_to_windows_1251 ISO_8859_5 WIN1251
iso_8859_5_to_windows_866 ISO_8859_5 WIN866
iso_8859_6_to_utf8 ISO_8859_6 UTF8
iso_8859_7_to_utf8 ISO_8859_7 UTF8
iso_8859_8_to_utf8 ISO_8859_8 UTF8
iso_8859_9_to_utf8 LATIN5 UTF8
johab_to_utf8 JOHAB UTF8
koi8_r_to_iso_8859_5 KOI8R ISO_8859_5
koi8_r_to_mic KOI8R MULE_INTERNAL
koi8_r_to_utf8 KOI8R UTF8
koi8_r_to_windows_1251 KOI8R WIN1251
koi8_r_to_windows_866 KOI8R WIN866
koi8_u_to_utf8 KOI8U UTF8
mic_to_big5 MULE_INTERNAL BIG5
mic_to_euc_cn MULE_INTERNAL EUC_CN
mic_to_euc_jp MULE_INTERNAL EUC_JP
mic_to_euc_kr MULE_INTERNAL EUC_KR
mic_to_euc_tw MULE_INTERNAL EUC_TW
mic_to_iso_8859_1 MULE_INTERNAL LATIN1
mic_to_iso_8859_2 MULE_INTERNAL LATIN2
mic_to_iso_8859_3 MULE_INTERNAL LATIN3
mic_to_iso_8859_4 MULE_INTERNAL LATIN4
mic_to_iso_8859_5 MULE_INTERNAL ISO_8859_5
mic_to_koi8_r MULE_INTERNAL KOI8R
mic_to_sjis MULE_INTERNAL SJIS
mic_to_windows_1250 MULE_INTERNAL WIN1250
mic_to_windows_1251 MULE_INTERNAL WIN1251
mic_to_windows_866 MULE_INTERNAL WIN866
sjis_to_euc_jp SJIS EUC_JP
sjis_to_mic SJIS MULE_INTERNAL
sjis_to_utf8 SJIS UTF8
windows_1258_to_utf8 WIN1258 UTF8
uhc_to_utf8 UHC UTF8
utf8_to_big5 UTF8 BIG5
utf8_to_euc_cn UTF8 EUC_CN
utf8_to_euc_jp UTF8 EUC_JP
utf8_to_euc_kr UTF8 EUC_KR
utf8_to_euc_tw UTF8 EUC_TW
utf8_to_gb18030 UTF8 GB18030
utf8_to_gbk UTF8 GBK
utf8_to_iso_8859_1 UTF8 LATIN1
utf8_to_iso_8859_10 UTF8 LATIN6
utf8_to_iso_8859_13 UTF8 LATIN7
utf8_to_iso_8859_14 UTF8 LATIN8
utf8_to_iso_8859_15 UTF8 LATIN9
utf8_to_iso_8859_16 UTF8 LATIN10
utf8_to_iso_8859_2 UTF8 LATIN2
utf8_to_iso_8859_3 UTF8 LATIN3
utf8_to_iso_8859_4 UTF8 LATIN4
utf8_to_iso_8859_5 UTF8 ISO_8859_5
utf8_to_iso_8859_6 UTF8 ISO_8859_6
utf8_to_iso_8859_7 UTF8 ISO_8859_7
utf8_to_iso_8859_8 UTF8 ISO_8859_8
utf8_to_iso_8859_9 UTF8 LATIN5
utf8_to_johab UTF8 JOHAB
utf8_to_koi8_r UTF8 KOI8R
utf8_to_koi8_u UTF8 KOI8U
utf8_to_sjis UTF8 SJIS
utf8_to_windows_1258 UTF8 WIN1258
utf8_to_uhc UTF8 UHC
utf8_to_windows_1250 UTF8 WIN1250
utf8_to_windows_1251 UTF8 WIN1251
utf8_to_windows_1252 UTF8 WIN1252
utf8_to_windows_1253 UTF8 WIN1253
utf8_to_windows_1254 UTF8 WIN1254
utf8_to_windows_1255 UTF8 WIN1255
utf8_to_windows_1256 UTF8 WIN1256
utf8_to_windows_1257 UTF8 WIN1257
utf8_to_windows_866 UTF8 WIN866
utf8_to_windows_874 UTF8 WIN874
windows_1250_to_iso_8859_2 WIN1250 LATIN2
windows_1250_to_mic WIN1250 MULE_INTERNAL
windows_1250_to_utf8 WIN1250 UTF8
windows_1251_to_iso_8859_5 WIN1251 ISO_8859_5
windows_1251_to_koi8_r WIN1251 KOI8R
windows_1251_to_mic WIN1251 MULE_INTERNAL
windows_1251_to_utf8 WIN1251 UTF8
windows_1251_to_windows_866 WIN1251 WIN866
windows_1252_to_utf8 WIN1252 UTF8
windows_1256_to_utf8 WIN1256 UTF8
windows_866_to_iso_8859_5 WIN866 ISO_8859_5
windows_866_to_koi8_r WIN866 KOI8R
windows_866_to_mic WIN866 MULE_INTERNAL
windows_866_to_utf8 WIN866 UTF8
windows_866_to_windows_1251 WIN866 WIN
windows_874_to_utf8 WIN874 UTF8
euc_jis_2004_to_utf8 EUC_JIS_2004 UTF8
utf8_to_euc_jis_2004 UTF8 EUC_JIS_2004
shift_jis_2004_to_utf8 SHIFT_JIS_2004 UTF8
utf8_to_shift_jis_2004 UTF8 SHIFT_JIS_2004
euc_jis_2004_to_shift_jis_2004 EUC_JIS_2004 SHIFT_JIS_2004
shift_jis_2004_to_euc_jis_2004 SHIFT_JIS_2004 EUC_JIS_2004

[a] 轉換名稱遵循標準的命名方案:源編碼的官方名稱,所有非字母數字字元替換為下劃線,後跟 _to_,然後是類似處理的目標編碼名稱。因此,這些名稱有時會偏離 表 23.3 中顯示的常用編碼名稱。


23.3.5. 進一步閱讀 #

以下是開始瞭解各種編碼系統的好起點。

CJKV 資訊處理:中文、日文、韓文和越南文計算

包含對 EUC_JPEUC_CNEUC_KREUC_TW 的詳細解釋。

https://www.unicode.org/

Unicode 聯盟的網站。

RFC 3629

UTF-8(8 位 UCS/Unicode 轉換格式)在此定義。

提交更正

如果您在文件中看到任何不正確、與您對特定功能的經驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。