中文在oracle裡到底佔幾個字元位

Aminiy發表於2012-12-07

問題描述

或許你會說一箇中文字元佔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個位元組了。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24492954/viewspace-765139/,如需轉載,請註明出處,否則將追究法律責任。

相關文章