問題描述
或許你會說乙個中文字元佔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個位元組了。
今天在oracle 10g下測試了下varchar2與nvarchar2這兩種型別,網上有很多關於這兩種型別的區別的帖子,我還是自己測試了下。
varchar2(size type),size最大為4000,type可為char或者byte,預設是byte。
varchar2最多存放4000位元組的資料,不管type是char還是byte。所以如果你設定varchar2(4000 char),你可以存入4000個字母,但是不能存入4000個漢字。如果資料庫字符集編碼是gbk,那麼varchar2最多能存放2000個漢字,如果字符集編碼是utf-8,那麼則只能最多存放1333個漢字了。
nvarchar2(size),size最大值為2000,單位是字元,而且不管是漢字還是字母,每個字元的長度都是2個位元組。所以nvarchar2型別的資料最多能存放2000個漢字,也最多只能存放2000個字母。並且nvarchar2不同於varchar2,他不受資料庫字符集的影響。
另外如果我們把a1,a2都設為varchar2(4000),並且這兩個欄位的內容長度都超過了2000位元組,那麼使用select a1||a2 from table這樣的語句時,因為結果超過了4000位元組,所以會報錯。
如果oracle 的字符集是utf-8, varchar2(4000)最多可以存1333個漢字,而varchar2(4000 char)其實和varchar2(1333 char)一樣,也是只能存1333個漢字;如果oracle的字符集是gbk,乙個漢字是2個位元組的話,varchar2(4000)最多可以存2000個漢字,而varchar2(4000 char)其實和varchar2(2000 char)一樣,也是只能存2000個漢字;
ORACLE中乙個字元佔多少位元組?
22.1 問題描述 或許你會說乙個中文字元佔2個位元組,這是一定的?如何計算乙個字串的位元組數?22.2 解決方案 在oracle中乙個字元特別是中文佔幾個位元組是不同的。比如我創立乙個表create table test ly a varchar2 4 b nvarchar2 4 你說a列能插入兩...
ORACLE中乙個字元佔多少位元組?
問題描述 或許你會說乙個中文字元佔2個位元組,這是一定的?如何計算乙個字串的位元組數?解決方案 在oracle中乙個字元特別是中文佔幾個位元組是不同的。比如我創立乙個表create table test ly a varchar2 4 b nvarchar2 4 你說a列能插入兩個漢字嗎?錯!最多能...
ORACLE中乙個字元佔多少位元組
在oracle中乙個字元特別是中文佔幾個位元組是不同的。比如我創立乙個表create table test ly a varchar2 4 b nvarchar2 4 錯!最多能插入乙個漢字加乙個字母 或數字 你說b列最多能插入多少個漢字,2個?不以n開頭的字段型別 比如char,varchar2 ...