About AL32UTF8
ORACLE數據庫字符集,即Oracle全球化支持(Globalization Support), 或即國家語言支持(NLS)其作用是用本國語言和格式來存儲、處理和檢索數據。利用全球化支持,ORACLE為用戶提供自己熟悉的數據庫母語環境,諸如日期格式、數字格式和存儲序列等。Oracle可以支持多種語言及字符集,其中oracle8i支持48種語言、76個國家地域、229種字符集,而oracle9i則支持57種語言、88個國家地域、235種字符集。由於oracle字符集種類多,且在存儲、檢索、遷移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已經不是推薦字符集列表中的一員了。我們在遇到不兼容的問題時就要修改字符集。
Difference between UTF8 and AL32UTF8 character sets in Oracle
Recently, one of our clients had a question on the differences between these two character sets since they were in the process of making their application global. In an upcoming whitepaper, we will discuss in detail what it takes (from a RDBMS perspective) to address localization and globalization issues. As far as these two character sets go in Oracle, the only difference between AL32UTF8 and UTF8 character sets is that AL32UTF8 stores characters beyond U+FFFF as four bytes (exactly as Unicode defines UTF-8). Oracle’s “UTF8” stores these characters as a sequence of two UTF-16 surrogate characters encoded using UTF-8 (or six bytes per character). Besides this storage difference, another difference is better support for supplementary characters in AL32UTF8 character set.
About ZHS16GBK
zhs16gbk是中文字符集,也就是適合在中國用,只能存儲中文和英文字符,如果你存儲韓文則顯示為亂碼(沒有編碼),而al32utf8是utf8字符集,u是unicode的意思,適合中文、韓語、日語等等不同的語言使用。那么為什么我們要在中國使用zhs16gbk存儲中文呢?這是因為utf8存儲中文的效率不如zhs16gbk,比如一個字“懂”,zhs16gbk采用2個字符存儲,而al32utf8采用3-4個字符存儲,這樣效率就有了高低之分。
參考資源:
https://blog.csdn.net/LYN_BIGDREAM/article/details/7473278
https://decipherinfosys.wordpress.com/2007/01/28/difference-between-utf8-and-al32utf8-character-sets-in-oracle/
https://community.oracle.com/thread/3514820?start=0&tstart=0
https://www.cnblogs.com/xiaomia/archive/2010/11/28/1890072.html
https://www.zhihu.com/question/66582405
https://docs.oracle.com/cd/B14099_19/idmanage.1012/b14082/nls.htm#i627585
https://jelly.iteye.com/blog/654300
https://blog.51cto.com/dw008/934741
https://blog.csdn.net/baidu_32262373/article/details/51891991
https://blog.csdn.net/btt2013/article/details/54628768
https://www.jianshu.com/p/37010902457c
https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::p11_question_id:5783936214008
http://icu-project.org/repos/icu/data/trunk/charset/source/gb18030/gbkuni30.txt
https://www.cnblogs.com/morvenhuang/archive/2011/11/11/2245410.html