概述:
本地化是系統(tǒng)或軟件運行的語言和文化環(huán)境。設(shè)置NLS_LANG環(huán)境參數(shù)是規(guī)定Oracle數(shù)據(jù)庫軟件本地化行為最簡單的方式。
NLS_LANG參數(shù)不但指定了客戶端應(yīng)用程序和Oracle數(shù)據(jù)庫所使用的語言和地區(qū);同時也指定了客戶端程序輸入數(shù)據(jù)和顯示數(shù)據(jù)所使用的字符集。
本文主要包含如下五部分
◆ NLS_LANG環(huán)境變量的構(gòu)成
◆ NLS_LANG環(huán)境變量的格式
◆ 如何查看數(shù)據(jù)庫NLS參數(shù)設(shè)置
◆ 舉例說明如何設(shè)置NLS_LANG環(huán)境變量
◆ 舉例說明一些特殊情況
一,NLS_LANG環(huán)境變量的構(gòu)成
NLS_LANG環(huán)境變量由如下三部分構(gòu)成:
1,LANGUAGE:客戶端系統(tǒng)所使用的語言。
指定Oracle數(shù)據(jù)庫反饋的消息(例如異常信息,提示信息等)、字符數(shù)據(jù)的排列順序(當指定ORDER BY時)、日(年月日中的天)名稱,月名稱等所使用的語言。
每個支持的語言都有唯一的名稱。例如,若操作系統(tǒng)使用簡體中文,則為SIMPLIFIED CHINESE;若操作系統(tǒng)使用美式英文操作系統(tǒng),則為AMERICAN。
LANGUAGE參數(shù)中隱含地區(qū)和字符集參數(shù)的信息。如果沒有指定LANGUAGE參數(shù)的值,則默認值為AMERICAN。
2,TERRITORY:客戶端系統(tǒng)所在的地區(qū)。
指定默認的日期,貨幣以及數(shù)字格式。
每一個支持的地區(qū)都有唯一的名稱。如,CHINA,AMERICA或CANADA。
如果沒有指定TERRITORY參數(shù),則此參數(shù)的值由LANGUAGE參數(shù)推理得出。
3,CHARSET:客戶端應(yīng)用程序所使用的字符集。
正確地設(shè)置NLS_LANG環(huán)境變量,則使得字符數(shù)據(jù)能夠在客戶端字符集和數(shù)據(jù)庫字符集之間正確地轉(zhuǎn)換。
設(shè)置NLS_LANG不會改變客戶端系統(tǒng)的字符集,它僅僅是讓Oracle數(shù)據(jù)庫知道客戶端應(yīng)用程序使用的是什么字符集,從而進行相應(yīng)的字符集轉(zhuǎn)換。
如果客戶端和數(shù)據(jù)庫字符集相同,則Oracle數(shù)據(jù)庫忽略字符集校驗,不執(zhí)行字符集轉(zhuǎn)換。
Oracle所支持的每個字符集都有唯一的縮寫。如,ZHS16GBK(GBK),AL32UTF8(UTF-8)等。
每一個LANGUAGE默認都有一個和它關(guān)聯(lián)的字符集。
二,NLS_LANG環(huán)境變量的格式
NLS_LANG = LANGEAGE_TERRITORY.CHARSET
注意,此處的.為英文逗號。
三,如何查看數(shù)據(jù)庫NLS參數(shù)設(shè)置
1,通過NLS_DATABASE_PARAMETERS視圖查看數(shù)據(jù)庫的NLS參數(shù)。
SELECT * FROM NLS_DATABASE_PARAMETERS ORDER BY PARAMETER;
查詢?nèi)缦聢D所示。其中,NLS_CHARACTERSET參數(shù)的值就表示數(shù)據(jù)庫所使用的字符集(創(chuàng)建數(shù)據(jù)庫時所指定的字符集)。
四,舉例說明如何設(shè)置NLS_LANG環(huán)境變量
此部分主要通過Oracle數(shù)據(jù)庫自帶的SQL PLUS數(shù)據(jù)庫客戶端程序說明如何設(shè)置NLS_LANG中的字符集。
實驗環(huán)境:
數(shù)據(jù)庫NLS參數(shù)設(shè)置:數(shù)據(jù)庫NLS參數(shù)設(shè)置如第三部分(查看數(shù)據(jù)庫NLS參數(shù)設(shè)置)中第一個圖所示,NLS_CHARACTERSET=AL32UTF8。
操作系統(tǒng):Windows 10英文企業(yè)版64位。
實驗準備:
1,創(chuàng)建一個表CHINESE_DATA
CREATE TABLE CHINESE_DATA( CH_DATA VARCHAR2(64));
實驗一:
此實驗舉例說明如何正確地設(shè)置命令行窗口和系統(tǒng)的NLS_LANG環(huán)境變量,從而能夠正確地顯示查詢結(jié)果。
1,設(shè)置客戶端系統(tǒng)的NLS_LANG環(huán)境變量
INSERT INTO CHINESE_DATA VALUES('漢字');COMMIT;
注意:插入數(shù)據(jù)時可以借助PL/SQL Developer等工具,以確保數(shù)據(jù)能正確地輸入并存儲到數(shù)據(jù)庫中。
3,使用默認環(huán)境,在不改變命令行窗口代碼頁(每個代碼頁都對應(yīng)著一個字符集)的情況下查詢數(shù)據(jù)。
437代碼頁對應(yīng)的字符集主要包含拉丁字母。
437代碼頁所包含的字符分類:
實驗二:
此實驗舉例說明數(shù)據(jù)庫不支持客戶端字符集所包含的字符時會產(chǎn)生什么樣的結(jié)果。
1,創(chuàng)建一個使用WE8MSWIN1252字符集的數(shù)據(jù)庫。
本次實驗創(chuàng)建了一個名為TALRASHA的數(shù)據(jù)庫,其使用WE8MSWIN1252字符集。
以下是通過NLS_DATABASE_PARAMETERS視圖所查詢到的數(shù)據(jù)庫NLS參數(shù)。
最終結(jié)論:
1,在查詢數(shù)據(jù)時,客戶端字符集應(yīng)該等于數(shù)據(jù)庫字符集或者是數(shù)據(jù)庫字符集的超集。從而避免顯示結(jié)果出現(xiàn)亂碼的問題。
2,在數(shù)據(jù)輸入時,客戶端字符集應(yīng)該等于數(shù)據(jù)庫字符集或者是數(shù)據(jù)庫字符集的子集。從而使得輸入字符能夠在數(shù)據(jù)庫中正確地保存。
3,在創(chuàng)建數(shù)據(jù)庫時,盡可能使用UNICODE字符集,從而避免字符數(shù)據(jù)不能正確存儲的問題。
五,舉例說明一些特殊情況
通過以上兩個實驗基本說明了客戶端應(yīng)用程序字符集,客戶端系統(tǒng)的NLS_LANG所包含的字符集和Oracle數(shù)據(jù)庫字符集三者之間的關(guān)系。
但是,某些數(shù)據(jù)庫客戶端應(yīng)用程序有自己獨立的客戶端環(huán)境配置,其不依賴于客戶端系統(tǒng)中的NLS環(huán)境變量或者依僅賴于某些系統(tǒng)環(huán)境變量。
例如,PL/SQL Developer和SQL Developer。它們的編輯器有自己的字符集和字體的設(shè)置,同時這兩個軟件也支持一些其他設(shè)置(如日期格式或者地區(qū)等)。
所以,在進行第四部分的試驗一時,建議先通過這兩個應(yīng)用程序插入數(shù)據(jù)。
此外,還需要注意字體對數(shù)據(jù)顯示的影響。有的字體不能正確地顯示輸入或查詢結(jié)果中的字符也會產(chǎn)生問題。