Chapter 20. 區域

Table of Contents
20.1. 區域支援
20.1.1. 概述
20.1.2. 行為
20.1.3. 問題
20.2. 字元集支援
20.2.1. 支援字元集編碼
20.2.2. 設置字元集
20.2.3. 伺服器和客戶端之間的自動字元集轉換
20.2.4. 進一步閱讀

本章從管理員的角度描述可用的區域特性。 PostgreSQL 透過三種途徑支援區域:

20.1. 區域支援

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

20.1.1. 概述

區域支援是在使用 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日期和時間的格式

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

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

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

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

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

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

一些訊息區域化庫也使用環境變量 LANGUAGE, 它覆蓋所有其它用於設置語言訊息的區域設置。如果有問題, 請參考您的操作系統的文件,特別是 gettext 的文件獲取更多訊息。

要打開訊息翻譯成用戶選擇的語言,製作時必需打開 NLS 選項。這個選項獨立於其它區域支援。

20.1.2. 行為

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

  • 使用 ORDER BY 和區域的查詢裡的排序。

  • The ability to use indexes with LIKE clauses 使用 LIKE 子句的索引的能力

  • 函數里的 to_char家族

  • 模式匹配中的 LIKE~ 操作符

PostgreSQL 裡使用非 CPOSIX 區域的缺點是速度。 它降低了字元處理的速度和阻止了在 LIKE 類查詢裡面普通索引的使用。 因此,只有在您實際上需要的時候才使用它。

20.1.3. 問題

如果經過上面解釋後區域支援仍然不能運轉,那您就要檢查一下看看您的操作系統的區域支援是否正確配置。 要檢查某個區域是否安裝並且正常運轉,您可以使用象命令 locale -a。 (如果您的系統提供了該命令)。

請檢查核實 PostgreSQL 確實使用了您認為它該用的區域設置。 LC_COLLATELC_CTYPE 設置都是在 initdb 的時候決定的,如果不重複 initdb 是不可能改變的。其它的區域設置包括 LC_MESSAGESLC_MONETARY 都是由伺服器啟動的環境決定的, 但是可以在執行時修改。您可以用 SHOW 命令檢查資料庫活躍的區域設置。

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

那些透過分析錯誤訊息處理伺服器端錯誤的客戶端應用很明顯會有問題,因為伺服器來的訊息可能會是以不同語言資料表示的。 我們建議這類應用的開發人員改用錯誤代碼機制。

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