oracle漢字佔用位元組長度,oracle漢字位元組

來源:互聯網
上載者:User

oracle漢字佔用位元組長度,oracle漢字位元組

1、        今天調查一個oracle資料庫問題的時候,發現在11g中一個漢字佔2個位元組,在10g中佔3個位元組,導致將11g資料庫中的資料匯入到10g的時候總是出錯,開始的時候還以為是11g和10g的版本不一樣,漢字佔用位元組數不一樣,後來一想,oracle不會這麼幹吧,那樣差別也太大了,後來一調查,發現是跟oracle的字元集編碼有關:

           如果是以下字元集,一個漢字佔用2個位元組:      SIMPLIFIED CHINESE_CHINA.ZHS16GBK           如果是以下字元集,一個漢字佔用3個位元組:      SIMPLIFIED CHINESE_CHINA.AL32UTF8  (1)查看oracle字元集可以用下面的sql文查看:         select userenv('language') from dual (2)查看當前oracle環境中一個漢字佔多少個位元組可以用下面的sql文查看:         select lengthb('啊') from dual  關於oracle字元集相關的知識(包括字元集查看和修改),主要參照:         http://www.cnblogs.com/rootq/articles/2049324.html         http://blog.csdn.net/uestcong/article/details/7348008
oracle漢字佔多少位元組問題

之前本人認為一個漢字都是佔兩個位元組的,MSSQL Server如此(至少在我的理解範圍之內,如果有誤還請大家糾正)。但是最近在使用Oracle資料庫,發現了一些特殊的東西,那就是,當你用兩個函數(分別是length和lengthb,這兩個函數到底是幹什麼用的,我想不需要我說明,大家查協助就可以了)進行查詢時,發現結果是lengthb是length的三倍(當然前提是length函數中的參數都是漢字了),這就奇怪了,不是說漢字佔兩個位元組嗎?怎麼這裡變成了三個?於是上網找資料,還真被我找到了。這個其實和Oracle的配置是相關的,用以下語句查詢:select * from v$nls_parameters t where t.PARAMETER='NLS_CHARACTERSET';可以查詢到當前資料庫的字元集,如果value=ZHS16GBK,那麼一個漢字佔用2個位元組,如果value=AL32UTF8,那麼一個漢字佔用3個位元組。於是查詢了一下本人的資料庫,字元集果然是AL32UTF8(這是Oracle資料庫預設的)。
 
ORACLE中一個字元佔多少位元組?

22.1 問題描述或許你會說一個中文字元佔2個位元組,這是一定的?如何計算一個字串的位元組數?22.2 解決方案在oracle中一個字元特別是中文占幾個位元組是不同的。比如我創立一個表create table test_ly(a varchar2(4),b nvarchar2(4))你說a列能插入兩個漢字嗎?錯!最多能插入一個漢字加一個字母(或數字)。這是為什嗎?因為一個漢字在a欄位中佔了3個位元組,其他字元(比如數字或者字母或者英文標點符號)佔1個位元組,你說b列最多能插入多少個漢字,2個?錯!b列最多能插入4個漢字,b列的一個漢字或者其他字元(比如數字或者字母或者英文標點符號)佔2個位元組。 由此可見,N開頭的欄位類型(比如NCHAR,NVARCHAR2)中,任何一個字元(包括一個漢字)佔2個位元組,統一的。不以N開頭的欄位類型(比如CHAR,VARCHAR2)中,unicode字元(比如漢字)佔3個位元組,其他字元佔1個位元組。 如何求一個字串佔用的字元數和位元組數?Length 函數求得是佔用字元數,lengthb或者vsize函數求得是佔用位元組數。你說 中華12 這個字串佔用了多少字元,位元組?看sql傳回值便清楚了。select length('中華12') from dual --返回4,也就是佔用4個字元select lengthb('中華12') from dual --返回8,也就是佔用8個位元組,其中中華兒子各佔3個位元組,而12兩個字元各佔一個位元組select lengthb(N'中華1') from dual --返回6,這是將字串轉換成為unicode字串後,每個字元佔用2個位元組,3個就是6個位元組select length(N'中華1') from dual --返回3,因為只有3個字元嘛。 字串類型欄位預設的長度是以位元組為單位的,具體取決於參數nls_length_semantics 的值(使用show parameters可以看到這個參數的值),預設是BYTE,也就是以位元組為單位的,如果是CHAR則是以字元為單位的。表的某列可以使用字元為單位嗎?當然可以,比如這樣建立即可:create table test_ly(a varchar2(4 char)) 這樣a列就最多能儲存4個字元,而不是4個位元組了。
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.