字符集總結:
一、服務器的字符集(用來存儲數據用的編碼格式)
二、操作系統字符集(用來顯示、解碼/編碼與oracle交互的編碼格式)
三、oracle客戶端字符集(用於轉換操作系統、服務器端編碼/解碼格式問題)
後續在使用過程中領悟到:
最基礎層是 數據庫(創建庫時的字符集)
第二層是:操作系統
第三層是:終端顯示
保持三層爲 相同字符集 既可,但要注意的是,必須以創建數據庫時所使用的 字符集 爲基準,進行設置 操作系統 、 終端的字符集,就基本沒有問題;
引用一段話:
字符集,實質就是按照一定的字符編碼方案,對一組特定的符號,分別賦予不同數值編碼的集合。Oracle數據庫最早支持的編碼方案是US7ASCII。Oracle的字符集命名遵循以下命名規則:<Language><bitsize><encoding> 即: <語言><比特位數><編碼> 。比如: AL32UTF8表示:AL,代表all,指使用所有語言;32,,32位;UTF8編碼。查看環境變量發現:NLS_LANG=American_America.AL32UTF8,American表示語言;America表示地區;AL32UTF8字符集類型。
AL32UTF8和UTF8有什麼區別呢?Oracle的UTF8字符集由來已久,至少在8的時候就已經存在了,而對應的是UNICODE 3.0。而AL32UTF8字符集是9i纔出現的,其對應的是UNICODE 5.0。這兩種字符集的區別在於,UNICODE 5.0與3.0相比,又增加了一些新的補充字符。但是在實際當中,使用到這些新增字符的可能性非常小,因此絕大部分情況下,選擇UTF8也是足夠的。AL32UTF8字符集是9i纔出現的,那麼對於9i以後的版本訪問沒有任何問題,但是對於8i及以前的版本,則不認識這個字符集。這就使得8i及更低版本的客戶端在訪問9i以上AL32UTF8的數據庫時,會碰到各種各樣的問題。因此,如果數據庫版本都在9i及其以上,不需要考慮ORACLE8的數據庫,建議使用AL32UTF8字符集,它採用的Unicode標準要比UTF8採用的Unicode標準更新,支持的字符也更多一些。如果要考慮ORACLE8數據庫,建議使用UTF8字符集,它的兼容性好,在ORACLE8及8I數據庫上使用AL32UTF8字符集容易出現問題。隨着現在版本11g逐漸開始稱爲主流版本,8i客戶端的情況已經越來越少見了,因此在11.2的DBCA中,UTF8已經不是推薦字符集列表中的一員了。我們在遇到不兼容的問題時就要修改字符集。
一、服務器的字符集(用來存儲數據用的編碼格式)
編碼字符集包含關係:ZHS32GB18030 > ZHS16GBK > ZHS16CGB231280 參考文章:http://docs.oracle.com/cd/B10501_01/server.920/a96529/appa.htm#956722
oracle 支持的字符集:
在 oracle 官方文檔中提到支持以下中文字符集:
ZHS16CGB231280 CGB2312-80 16-bit Simplified Chinese -- 11g 已不支持
ZHS16GBK GBK 16-bit Simplified Chinese
ZHS32GB18030 GB18030-2000 -- 11g 已不支持
ZHT16BIG5 BIG5 16-bit Traditional Chinese -- 11g 已不支持
ZHT32EUC EUC 32-bit Traditional Chinese
ZHT16HKSCS MS Windows Code Page 950 with Hong Kong Supplementary Character Set
ZHT16MSWIN950 MS Windows Code Page 950 Traditional Chinese
而我在11g創建 DB 時,選項中只支持以下幾種中文字符集:
ZHS16GBK GBK 16-bit Simplified Chinese -- 我們中國大陸只能選它了...
ZHT16HKSCS MS Windows Code Page 950 with Hong Kong Supplementary Character Set
ZHT16MSWIN950 MS Windows Code Page 950 Traditional Chinese
ZHT32EUC EUC 32-bit Traditional Chinese
AL32UTF8 Unicode 4.0 UTF-8 Universal character set -- 實驗時,使用的是字符集,證明可以存儲 ZHS16GBK 以外的字符集
二、操作系統字符集(用來顯示、解碼/編碼與oracle交互的編碼格式)
linux命令下:
locale -a -- 查看操作系統支持哪些字符集;
locale charmap -- 看操作系統的字符解碼是哪種方式;
export LANG=zh_CN.UTF-8 -- 設置操作系統 爲 中文,utf8編碼方式
三、oracle客戶端字符集(用於轉換操作系統、服務器端編碼/解碼格式問題)
linux命令下:
export NLS_LANG='SIMPLIFIED CHINESE_CHINA.AL32UTF8' -- 設置 語言:簡體中文 區域:中國 編碼:utf8
實驗:
測試字符(以下字符都不在GBK字符範圍內):
<由於這些字符不能發佈到CSDN,一發布,下面文章就沒有了,所以只能以圖片方式發了>
一、 gbk字符集的情況下
條件:
服務器端oracle的字符集:ZHS16GBK
linux終端環境變量設置 LANG:export LANG="zh_CN.GB18030"
linux終端環境變量設置 NLS_LANG: export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS32GB18030"
CREATE TABLE TST_CHARACTER
(
F1 NVARCHAR2(8)
);
結果:
一、sqlplus中試驗
1. INSERT INTO TST_CHARACTER values(''); -- 成功
select * from TST_CHARACTER ; -- 失敗,亂碼;
F1
--------------------------------
??
select * from TST_CHARACTER where F1='' -- 查詢成功,但是亂碼;
二、P/L SQL Developer 8.0 版本試驗
1. select * from TST_CHARACTER for update; -- 使用把拷貝進去,成功顯示, 但是不能使用where 條件查詢;
select * from TST_CHARACTER where F1='' -- 查詢不成功;
select * from TST_CHARACTER -- 能顯示 '' 字
二、 AL32UTF8 字符集的情況下
條件:
服務器端oracle的字符集: AL32UTF8
linux終端環境變量設置 LANG:export LANG="zh_CN.UTF-8"
linux終端環境變量設置 NLS_LANG: export NLS_LANG='SIMPLIFIED CHINESE_CHINA.AL32UTF8'
CREATE TABLE TST_CHARACTER
(
F1 NVARCHAR2(8)
);
結果:
一、sqlplus中試驗
SQL> INSERT INTO TST_CHARACTER values(''); -- 成功
SQL> select * from tst_character; -- 失敗,亂碼;
F1
--------------------------------
��
SQL> select * from TST_CHARACTER where F1='' ; -- 成功,但顯示爲亂碼;
二、P/L SQL Developer 8.0 版本試驗
INSERT INTO TST_CHARACTER values('') ; -- 成功
commit;
select * from TST_CHARACTER -- 失敗,亂碼;
select * from TST_CHARACTER where F1='' for update; -- 成功找到數據,但顯示爲亂碼;
直到現在,還沒有找到一種方法可以正確存入,並能條件查詢,並正確反顯的。。。。。。。。。
有時間再搞,得睡了。。。。。
以上如果有哪位大蝦能幫解決一下麼,謝謝啦 ~!~