?
本文檔使用 PHP中文網(wǎng)手冊 發(fā)布
區(qū)域 支持指的是應(yīng)用中考慮字母、排序、數(shù)字格式化等與文化相關(guān)的問題。 PostgreSQL 使用服務(wù)器操作系統(tǒng)提供的標(biāo)準(zhǔn) ISO C 和 POSIX 區(qū)域機制。 更多的信息請參考你的系統(tǒng)文檔。
區(qū)域支持是在使用initdb創(chuàng)建一個數(shù)據(jù)庫集群的時候自動初始化的。 缺省時,initdb 將會按照它的執(zhí)行環(huán)境的區(qū)域設(shè)置初始化數(shù)據(jù)庫集群; 因此如果你的系統(tǒng)已經(jīng)設(shè)置為你的數(shù)據(jù)庫集群想要的區(qū)域,那么你就沒有什么可干的。 如果你想使用其它的區(qū)域(或者你還不知道你的系統(tǒng)設(shè)置的區(qū)域是什么),那么你可以用 --locale 命令行選項告訴initdb 比如:
initdb --locale=sv_SE
這個例子是在Unix 系統(tǒng)上 把區(qū)域設(shè)置為瑞典 (sv) 用瑞典語說話(SE)。 其它的可能性是 en_US (美國英語) and fr_CA (加拿大法語). 如果多于一種字符集用于區(qū)域, 那么你可以從language_territory.codeset進行詳細設(shè)置。 例如: fr_BE.UTF-8 代表 比利時人說的法語, 將編碼設(shè)置為UTF-8 。
你的系統(tǒng)里有哪些可用的區(qū)域設(shè)置,它們的名字是什么, 這些信息都取決于你的操作系統(tǒng)提供商提供了什么以及你安裝了什么東西。 在大多數(shù)Unix 系統(tǒng)上,命令 locale -a 將提供所有可用區(qū)域的一個列表。 Windows 使用冗長的 區(qū)域名稱, 像 German_Germany 或者Swedish_Sweden.1252,但是基本原則是一樣的。
有時候,把幾種區(qū)域規(guī)則混合起來也很有用,比如,使用英語字符規(guī)則而用西班牙語信息。為了支持這些,我們有一套區(qū)域子范疇用于控制區(qū)域規(guī)則的某一方面:
LC_COLLATE | 字符串排序順序 |
LC_CTYPE | 字符分類(什么是字母?它是這個字母的等效大寫?) |
LC_MESSAGES | 信息語言 |
LC_MONETARY | 貨幣金額的格式 |
LC_NUMERIC | 數(shù)字的格式 |
LC_TIME | 日期和時間的格式 |
如果你想要你的系統(tǒng)表現(xiàn)得像沒有區(qū)域支持一樣,那么使用特殊的區(qū)域 C or POSIX.
一些區(qū)域范疇的性質(zhì)是它們的值必需在數(shù)據(jù)庫集群的生命期內(nèi)固定。 也就是說,一旦運行了 initdb 之后,你就再也不能更改它們了。 LC_COLLATE 和 LC_CTYPE 就是這樣的范疇。 它們影響索引的排序順序,因此它們必需保持固定,否則在文本字段上的索引將會崩潰。
其它區(qū)域范疇可以在服務(wù)器啟動的時候根據(jù)需要設(shè)置運行時配置變量來改變 (參見 Section 18.10.2 詳細信息). initdb 選擇的缺省值實際上只是做為服務(wù)器啟動缺省寫入 postgresql.conf配置文件。 如果你在 postgresql.conf 里面刪除了這些缺省值,那么服務(wù)器將會繼承來自運行環(huán)境的設(shè)置。
請注意服務(wù)器的區(qū)域行為是由它看到的環(huán)境變量決定的, 而不是由客戶端的環(huán)境變量影響的。因此, 我們要在啟動服務(wù)器之前認真地設(shè)置好這些變量。 這樣帶來的一種情況是如果客戶端和服務(wù)器設(shè)置成不同的區(qū)域, 那么消息可能以不同的語言呈現(xiàn),實際情況取決于它們的源是什么。
Note: 在我們談到從執(zhí)行環(huán)境繼承區(qū)域的時候, 我們的意思是在大多數(shù)操作系統(tǒng)上的下列動作: 對于一個給定的區(qū)域范疇,比如字符集, 按照下面的順序評估這些環(huán)境變量, 直到找到一個已設(shè)置的: LC_ALL, LC_COLLATE (變量對應(yīng)相應(yīng)的范疇), LANG. 。 如果這些環(huán)境變量一個都沒有設(shè)置,那么區(qū)域缺省為 C.
一些信息區(qū)域化庫也使用環(huán)境變量 LANGUAGE 它覆蓋所有其它用于設(shè)置語言信息的區(qū)域設(shè)置。 如果有問題,請參考你的操作系統(tǒng)文檔,特別是 gettext的文檔獲取更多信息。
要允許將信息翻譯成用戶選擇的語言,編譯時必需打開 NLS 選項(configure --enable-nls)。所有其它的本地化支持會在編譯時自動提供。
區(qū)域設(shè)置特別影響下面的 SQL 特性:
使用 ORDER BY 和 區(qū)域的排序
使用 LIKE 子句的索引能力
upper
, lower
, and initcap
函數(shù)
to_char
函數(shù)族
PostgreSQL里使用非 C orPOSIX 是速度。它降低了字符處理的速度并阻止了在LIKE 類查詢里面普通索引的使用。因此,只有在你實際上需要的時候才使用它。
為了允許 PostgreSQL在非 C 區(qū)域下的 LIKE 子句中使用索引,有好幾個自定義的操作符類可以用。 這些操作符類允許創(chuàng)建一個嚴格地比較每個字符的索引,而忽略區(qū)域比較規(guī)則。 請參考 Section 11.9 獲取更多信息。
如果經(jīng)過上面解釋后區(qū)域支持仍然不能運轉(zhuǎn), 那你就要檢查一下操作系統(tǒng)的區(qū)域支持是否正確配置。 要檢查某個區(qū)域是否安裝并且正常運轉(zhuǎn),你可以使用 locale -a 命令(如果你的系統(tǒng)提供了該命令)。
請檢查核實PostgreSQL 確實使用了你認為它該用的區(qū)域設(shè)置。 The LC_COLLATE 和LC_CTYPE 的設(shè)置都是在initdb 時決定的,如果不重復(fù) initdb 是不可能改變的。 其它的區(qū)域設(shè)置包括 LC_MESSAGES 和 LC_MONETARY 都是由服務(wù)器的啟動環(huán)境決定的,但是可以在運行時修改。 你可以用 SHOW 命令檢查數(shù)據(jù)庫正在使用的區(qū)域設(shè)置。
目錄src/test/locale 目錄包含 PostgreSQL的區(qū)域支持測試套件。
那些通過分析錯誤信息處理服務(wù)器端錯誤的客戶端應(yīng)用很明顯會有問題,因為服務(wù)器信息可能會以不同的語言表示。我們建議這類應(yīng)用的開發(fā)人員改用錯誤代碼機制。
維護信息翻譯表需要許多志愿者的堅持不懈的努力,他們就是希望 PostgreSQL以他們的語言說話的人。如果你的語言信息目前還不可用或者沒有完全翻譯完成,那么我們很歡迎你的協(xié)助。如果你想幫忙,那么請參考Chapter 48或者向開發(fā)者郵遞列表發(fā)郵件。