Chapter 5. 區域

Table of Contents
5.1. 區域支援
5.1.1. 概述
5.1.2. 益處
5.1.3. 問題
5.2. 多字節支援
5.2.1. 支援字元集編碼
5.2.2. 設定編碼
5.2.3. 伺服器和客戶端之間的自動編碼轉換
5.2.4. 如果不能轉換會怎樣?
5.2.5. 參考
5.2.6. 歷史
5.2.7. Windows/ODBC 裡的 WIN1250
5.3. 單字節字元集記錄

從管理員的角度描述可用的區域特性.

PostgreSQL 通過三種途徑支援區域:

5.1. 區域支援

區域支援指的是應用中考慮字母,排序,數位格式化 等與文化相關的問題. PostgreSQL 使用伺服器操作系統提供的標準 ISO C 和類似POSIX的區域機制. 更多的資訊請參考你的系統的文件.

5.1.1. 概述

區域支援是 在使用 initdb 建立一個資料庫集群的時候自動初始化的. initdb 將會按照它的執行環境的區域設定初始化 資料庫集群﹔因此如果你的系統已經設定為你的資料庫集群想要的區域, 那麼你就沒有什麼可幹的.如果你想使用其它的區域(或者你還不知道 你的系統設定的區域是什麼),那麼你可以用 --locale 告訴 initdb 你需要的區域究竟是哪個. 比如︰

$ initdb --locale=sv_SE

這個範例就把區域設定為瑞典(sv),用瑞典語說話 (SE).其他的可能性是 en_US(美國英語)和 fr_CA (加拿大法語). 如果有多於一種字元集可以用於區域,那麼宣告看起來象下面這樣: cs_CZ.ISO8859-2.你的系統裡有哪些可用的區域設定,它們的名字 是什麼,這些資訊都取決於你的操作系統提供商提供了什麼 以及你安裝了什麼東西.

有時候,把幾種區域規則混合起來也很有用,比如,使用美國字元規則 而用西班牙語資訊.為了支援這些,我們有一套區域幾範疇用於控制區域規則 的某一方面.

LC_COLLATE字串排序順序
LC_CTYPE字元分類(什麼是字母?什麼是這個字母的等效大寫?)
LC_MESSAGES資訊的語言
LC_MONETARY貨幣金額的格式
LC_NUMERIC數位的格式
LC_TIME日期和時間的格式

這些範疇名轉換成 initdb 選項的名字以 覆蓋某個特定範疇的區域選擇.比如,要把區域設定為加拿大法語, 但使用 U.S. 規則進行貨幣格式化,可以使用 initdb --locale=fr_CA --lc-monetary=en_US

如果你想要你的系統表現得象沒有區域支援,那麼使用特殊的區域 CPOSIX

一些區域範疇的性質是它們的值必需在資料庫集群的生命期內固定. 也就是說,一旦運行了 initdb,你就再也不能 變更它們了.LC_COLLATELC_CTYPE 就是這樣的範疇.它們影響索引的排序順序,因此它們必需保持固定, 否則在純文字欄位上的索引將會崩潰.PostgreSQL 通過記錄 initdb 看到的 LC_COLLATELC_CTYPE 來強迫這一點. 伺服器在啟動的時候自動使用這兩個數值.

其它區域範疇可以在伺服器啟動的時候根據需要設定運行時配置變數 來改變(參閱 Section 3.4 獲取細節). initdb 選擇的預設值實際上只是做為伺服器 運行預設寫入配置文件 postgresql.conf. 如果你在 postgresql.conf 裡面刪除了 相應的賦值,那麼伺服器將會繼承來自運行環境的設定.

請注意伺服器的區域行為是由它看到的環境變數決定的,而不是由任何客戶端 的環境變數影響的.因此,我們要在啟動伺服器之前認真地設定好這些變數. 這樣帶來的一種情況是如果客戶端和伺服器設定成不同的區域, 那麼訊息可能以不同的語言餘現,實際情況取決於它們的源是什麼.

注意: 在我們談到從執行環境繼承區域的時候,我們的意思是在大多數操作系統上的 下列動作︰對於一個給定的區域範疇,比如字元集,按照下面的順序評估 這些環境變數,直到找到一個設定了的︰LC_ALLLC_COLLATE(變數對應相應的範疇), LANG.如果這些環境變數一個都沒有設定,那麼 區域預設為 C

一些資訊區域化庫也使用環境變數 LANGUAGE, 它覆蓋所有其它用於設定語言資訊的區域設定.如果有問題, 請參考你的操作系統的文件,特別是 gettext 手冊頁獲取更多資訊.

要打開使用者選擇的資訊翻譯,我們必需使用 --enable-nls 選項.這個選項獨立於其它區域支援.

5.1.2. 益處

區域支援特別影響下面的特性:

  • ORDER BY 查詢裡的排序順序.

  • 函數裡的 to_char家族

  • 樣式相符中的 LIKE~ 運算子

PostgreSQL 裡區域支援的唯一的嚴重缺點是速度.因此 只有你需要的時候才使用它. 同時我們還要特別指出的是選擇一個非 C 區域設定將關閉為 LIKE~ 運算子設定的索引最佳化, 這樣對那些使用這些運算子的搜尋可能有巨大的性能影響.

5.1.3. 問題

如果經過上面解釋後區域支援仍然不能運轉,那你就要檢查一下看看 你的操作系統的區域支援是否正確配置. 要檢查某個區域是否安裝並且正常運轉,你可以使用象 Perl 這樣的工具.Perl 也支援區域,而且如果區域破損了,perl -v 會發出類似下面的抱怨:

$ export LC_CTYPE='not_exist'
$ perl -v
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LC_ALL = (unset),
LC_CTYPE = "not_exist",
LANG = (unset)
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").

檢查你的區域文件是否在正確位置.可能的位置包括: /usr/lib/localeLinuxSolaris), /usr/share/localeLinux), /usr/lib/nls/locDUX 4.0).如果你 不知道在那裡,請檢查你的系統的手冊頁.

請檢查核實 PostgreSQL 確實使用了你認為它該用的 區域設定.LC_COLLATELC_CTYPE 設定都是 在 initdb 的時候決定的,如果不重復 initdb 是不可能改變的.其它的區域設定包括 LC_MESSAGESLC_MONETARY 都是由 postmaster 啟動的環境決定的, 可以通過簡單地重啟來修改.你可以用 contrib/pg_controldata 工具程式 檢查資料庫的 LC_COLLATELC_CTYPE 的設定.

目錄 src/test/locale 包含 PostgreSQL 的區域支援的測試套件.

那些通過分析錯誤資訊處理伺服器端錯誤的客戶端應用很明顯 會有問題,因為伺服器來的資訊可能會是以不同語言表示的. 如果你使用了這樣的應用,那麼你應該設計一個計劃來處理這種情況. 內嵌的 SQL 接口(ecpg)也受這個問題影響. 我們目前建議使用 ecpg 應用做接口的伺服器 配置成發送英文資訊.

維護資訊翻譯表需要許多志愿者的堅持不懈的努力, 他們就是希望 PostgreSQL 以它們的語言說話的人. 如果你的語言的資訊目前還不可用或者沒有完全翻譯完成, 那麼我們很歡迎你的協助.如果你想幫忙,那麼請參考 開發人員手冊或者向開發者郵遞清單發郵件.