PostgreSQL 字元編碼總結
字符集可在 initdb、createdb、”create database” 時設定,每個資料庫的字符集必須和 LC_CTYPE、LC_COLLATE 設定相容,C 或 POSIX 區域相容任意字符集,但其他區域只相容一種字符集(在 Windows 上 UTF-8 編碼可相容任意區域)。
PostgreSQL 支援編碼在服務端和前端之間的自動編碼轉換,也可以使用 SQL 命令建立一種編碼轉換。比如資料庫使用了 EUC_JP 日文編碼,但前端收到的是 UTF8 編碼的資料,資料庫內部會自動完成 UTF8 到 EUC_JP 的編碼轉換。
若資料庫被設定為 SQL_ASCII 編碼,位元組值 [0, 127] 依據 ASCII 標準解釋,[128, 255] 作為無法解析的字元,資料庫不會做任何編碼轉換。也就是說,使用了非 ASCII 資料時,資料庫不會轉換編碼,也不會校驗非 ASCII 字元。
若客戶端使用了 SQL_ASCII 編碼傳送 SQL 語句,那麼資料庫的自動編碼轉換會禁用,不管資料庫的字符集是什麼。
這種行為被允許但會被棄用:通過超級使用者建立資料庫,資料庫編碼為 SQL_ASCII,LC_CTYPE 不為 C 也不為 POSIX。
除非很明確地知道資料庫記憶體入的資料都是 ASCII 資料,否則不建議將資料庫編碼設定為 SQL_ASCII ,也不建議客戶端編碼設定為 SQL_ASCII。
表格Client/Server Character Set Conversions 顯示了 PostgreSQL 支援的服務端/客戶端的自動編碼轉換,比如資料庫編碼採用 EUC_JP,客戶端可使用 EUC_JP、MULE_INTERNAL、SJIS、UTF8 編碼,資料庫內部就能夠完成自動編碼轉換。若資料庫採用 UTF8 編碼,那麼客戶端使用任意編碼都行。進一步地看,不管資料庫使用什麼編碼,自動編碼轉換支援使用 UTF8 編碼的客戶端;不過有一個例外就是資料庫採用 MULE_INTERNAL 編碼,客戶端使用 UTF8 時就無法做自動編碼轉換。
Advertisements