一、不一樣OS客戶端字符集查看與設置:
windows:
cmd->chcp #查看:936就是中文字符集 GBK,不用設置;
cmd->echo %NLS_LANG% #查看NLS_LANG設置;
查看註冊表:HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMExx\
設置:C:\Users\Fang>set NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
set NLS_LANG=american_america.al32utf8
Linux:
locale #查看LANG=zh_CN.UTF-8;
echo $NLS_LANG
export NLS_LANG=american_america.zhs16gbk
export NLS_LANG="simplified chinese"_china.zhs16gbk
在環境變量文件.bash_profile中設置
UNIX:
locale ,env|grep LANG, echo $LANG
env|grep NLS_LANG
export NLS_LANG=american_america.AL32UTF8
export NLS_LANG="Simplified Chinese_china".ZHS16GBK
在環境變量文件.bash_profile中設置
正確設置字符集:客戶端字符集與NLS_LANG設置一致便可,若是客戶端未明確設置NLS_LANG會使用OS的字符集。
客戶端軟件自己有字符集,就不會使用所在OS的字符集,由於oracle有本身的字符集,與oracle所在的OS字符沒有關係.
二、oracle字符集存儲及讀取的機制
客戶端將字符調用本身的字符集(軟件有字符集使用本身的,軟件沒有使用操做系統的)將字符轉成對應的編碼傳
給oracle,由於oracle經過NLS_LANG確認客戶端字符集。若是NLS_LANG與oracle字符集設置一致直接存儲編碼,若是不
一致oracle會先將編碼利用NLS_LANG轉成字符,再將字符轉成本身的編碼格式存儲;讀取時也是如此,oracle會將存儲
的編碼轉成客戶單NLS_LANG格式可用的編碼。當客戶端字符集大於oracle字符集時會出現字符丟失狀況。
DBCA建立數據庫實例時須要設置數據庫字符集合國家字符集,查看語句
select * from nls_database_parameters where parameter ='NLS_CHARACTERSET';
select * from nls_database_parameters where parameter ='NLS_NCHAR_CHARACTERSET';
select userenv('language') from dual; --查詢數據庫使用的字符集及語言
字符編碼:字符轉換成存儲編碼
數據庫字符集
用來存儲CHAR, VARCHAR2, CLOB, LONG等字符類型數據,字符表達式
國家字符集
用以存儲NCHAR, NVARCHAR2, NCLOB等類型數據,國家字符表達式
三、字符集命名
Oracle的字符集命名遵循如下命名規則:
<Language><bit size><encoding> 即: <語言><比特位數><編碼>
好比: ZHS16GBK表示採用GBK編碼格式、16位(兩個字節)簡體中文字符集
常見字符集編碼:
US7ASCII:26字母少於128
zhs16cgb231280:中文國標不全
AL32UTF8:比utf8還全,unincode編碼
AF16UTF16:國家字符集統一的選擇
ZHS16GBK:最新國標
utf8:基本通用字符集
超集:包含,但編碼能夠不一致
嚴格超集:包含,且編碼一致
NLS_LANG=<language>_<territory>.<client character set>
Language:顯示oracle消息,校驗,日期命名
Territory:指定默認日期、數字、貨幣等格式
Client character set:指定將使用的字符集
例如:NLS_LANG=AMERICAN_AMERICA.US7ASCII :AMERICAN是語言,AMERICA是地區,US7ASCII是客戶端字符集
兩個數據庫之間的字符集只要第三部分同樣就能夠相互導入導出數據,前面影響的只是提示信息是中文仍是英文。
四、編碼轉換
select id,dump(name,1016) from t2; --10會顯示字符集16是進制
select nls_charset_name(to_number('0354','xxxx')) from dual;
select to_char(nls_charset_id('ZHS16GBK'), 'xxxx') from dual;
當NLS_LANG與oracle的編碼一致,與客戶端的編碼不一致時會存儲的編碼沒問題。
五、修改數據庫字符集
若是須要修改字符集,一般須要導出數據庫數據,重建數據庫,再導入數據庫數據的方式來轉換。
在RESTRICTED模式下將數據庫字符集改成當前字符集的超級。
shutdown immediate;
startup mount
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
alter database open;
ALTER DATABASE character set INTERNAL_USE ZHS16GBK;
shutdown immediate;
startup
select * from v$nls_parameters;
六、EXP/IMP 與 字符集
導出過程須要根據客戶段OS的編碼設置NLS_LANG對應編碼存儲,若是NLS_LANG與數據庫字符集不一致
就會發生字符轉換,字符轉換可能會致使字符丟失問題。因此建議導出導入時儘量在會話裏設置一致的
客戶端字符集和NLS_LANG。
數據庫