| PostgreSQL 8.0.0 中文文件(轉譯自 PostgreSQL 中國 製作的簡體中文版本) | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Fast Forward | Next | |
本章從管理員的角度描述可用的區域特性。 PostgreSQL 透過三種途徑支援區域:
利用操作系統庫的區域(locale)特性,提供對集合順序,數字格式, 翻譯過的訊息,和其它方面的支援。
提供一些定義在 PostgreSQL 伺服器裡的不同的節字元集, 包括多字元字元集,以支援多種類型的語言的排序文本, 以及提供客戶端和伺服器端之間的字元集記錄。
單字元字元記錄為多字元和單字元字元集的用戶提供了一種更輕量級的解決方法。
區域支援指的是應用中考慮字母,排序,數字格式化等與文化相關的問題。 PostgreSQL 使用伺服器操作系統提供的標準 ISO C 和POSIX的區域機制。 更多的訊息請參考您的系統的文件。
區域支援是在使用 initdb 建立一個資料庫集群的時候自動初始化的。 預設時,initdb 將會按照它的執行環境的區域設置初始化資料庫集群; 因此如果您的系統已經設置為您的資料庫集群想要的區域, 那麼您就沒有什麼可幹的。如果您想使用其它的區域(或者您還不知道您的系統設置的區域是什麼), 那麼您可以用 --locale告訴 initdb 您需要的區域究竟是哪個。 比如:
initdb --locale=sv_SE
這個例子就把區域設置為瑞典(sv),用瑞典語說話(SE)。 其他的可能性是 en_US(美國英語)和 fr_CA (加拿大法語)。 如果有多於一種字元集可以用於區域,那麼聲明看起來像下面這樣: cs_CZ.ISO8859-2。您的系統裡有哪些可用的區域設置,它們的名字是什麼, 這些訊息都取決於您的操作系統提供商提供了什麼以及您安裝了什麼東西。 (在大多數系統上,命令 locale -a 將提供所有可用的區域的一個列資料表。)
有時候,把幾種區域規則混合起來也很有用,比如,使用英語字元規則而用西班牙語訊息。 為了支援這些,我們有一套區域子範疇用於控制區域規則的某一方面:
| LC_COLLATE | 字元串排序順序 |
| LC_CTYPE | 字元分類(什麼是字母?它是這個字母的等效大寫?) |
| LC_MESSAGES | 訊息的語言 |
| LC_MONETARY | 貨幣金額的格式 |
| LC_NUMERIC | 數字的格式 |
| LC_TIME | 日期和時間的格式 |
如果您想要您的系統資料表現得像沒有區域支援,那麼使用特殊的區域 C 或 POSIX。
一些區域範疇的性質是它們的值必需在資料庫集群的生命期內固定。 也就是說,一旦執行了 initdb,您就再也不能更改它們了。 LC_COLLATE 和 LC_CTYPE 就是這樣的範疇。它們影響索引的排序順序,因此它們必需保持固定, 否則在文本字串上的索引將會崩潰。PostgreSQL 透過記錄 initdb 看到的 LC_COLLATE 和 LC_CTYPE 來強迫這一點。 伺服器在啟動的時候自動使用這兩個數值。
其它區域範疇可以在伺服器啟動的時候根據需要設置執行時配置變量來改變(參閱 Section 16.4.8.2 獲取細節)。 initdb 選擇的預設值實際上只是做為伺服器執行預設寫入配置文件 postgresql.conf。 如果您在 postgresql.conf 裡面刪除了相應的賦值,那麼伺服器將會繼承來自執行環境的設置。
請注意伺服器的區域行為是由它看到的環境變量決定的,而不是由任何客戶端的環境變量影響的。 因此,我們要在啟動伺服器之前認真地設置好這些變量。 這樣帶來的一種情況是如果客戶端和伺服器設置成不同的區域, 那麼消息可能以不同的語言呈現,實際情況取決於它們的源是什麼。
注意: 在我們談到從執行環境繼承區域的時候,我們的意思是在大多數操作系統上的下列動作: 對於一個給定的區域範疇,比如字元集,按照下面的順序評估這些環境變量, 直到找到一個設置了的:LC_ALL, LC_COLLATE(變量對應相應的範疇), LANG。如果這些環境變量一個都沒有設置,那麼區域預設為 C。
一些訊息區域化庫也使用環境變量 LANGUAGE, 它覆蓋所有其它用於設置語言訊息的區域設置。如果有問題, 請參考您的操作系統的文件,特別是 gettext 的文件獲取更多訊息。
要打開訊息翻譯成用戶選擇的語言,製作時必需打開 NLS 選項。這個選項獨立於其它區域支援。
區域支援特別影響下面的特性:
PostgreSQL 裡使用非 C 或 POSIX 區域的缺點是速度。 它降低了字元處理的速度和阻止了在 LIKE 類查詢裡面普通索引的使用。 因此,只有在您實際上需要的時候才使用它。
如果經過上面解釋後區域支援仍然不能運轉,那您就要檢查一下看看您的操作系統的區域支援是否正確配置。 要檢查某個區域是否安裝並且正常運轉,您可以使用象命令 locale -a。 (如果您的系統提供了該命令)。
請檢查核實 PostgreSQL 確實使用了您認為它該用的區域設置。 LC_COLLATE 和 LC_CTYPE 設置都是在 initdb 的時候決定的,如果不重複 initdb 是不可能改變的。其它的區域設置包括 LC_MESSAGES 和 LC_MONETARY 都是由伺服器啟動的環境決定的, 但是可以在執行時修改。您可以用 SHOW 命令檢查資料庫活躍的區域設置。
目錄 src/test/locale 包含 PostgreSQL 的區域支援的測試套件。
那些透過分析錯誤訊息處理伺服器端錯誤的客戶端應用很明顯會有問題,因為伺服器來的訊息可能會是以不同語言資料表示的。 我們建議這類應用的開發人員改用錯誤代碼機制。
維護訊息翻譯資料表需要許多志願者的堅持不懈的努力, 他們就是希望 PostgreSQL 以它們的語言說話的人。 如果您的語言的訊息目前還不可用或者沒有完全翻譯完成, 那麼我們很歡迎您的協助。如果您想幫忙,那麼請參考 Chapter 44 或者向開發者郵遞列資料表發郵件。