Oracle的函數vsize和length的區別討論

來源:互聯網
上載者:User

The "length" functions return the length of char. LENGTH calculates length using characters as defined by the input character set.

LENGTHB uses bytes instead of characters. LENGTHC uses Unicode complete characters. LENGTH2 uses UCS2 codepoints. LENGTH4 uses UCS4 codepoints

length函數返回字元的長度,它使用定義好的輸入的字元集計算長度.
lengthb使用bytes代替字元

VSIZE returns the number of bytes in the internal representation of expr.

vsize 返回內部表示的位元組的數目。internal representation of expr誰能解釋一下。

看sql樣本:

select length('adfad合理') "bytesLengthIs" from dual --7

select lengthb('adfad') "bytesLengthIs" from dual --5

select lengthb('adfad合理') "bytesLengthIs" from dual --11

select vsize('adfad合理') "bytesLengthIs" from dual --11

select lengthc('adfad合理')"bytesLengthIs" from dual --7

結論:在utf-8的字元集下
lengthb=vsize
lengthc=length

疑問:中文字元怎麼會佔用了3個byte?而不是2個。是utf-8字元集的原因?
誰知道??????

參考文獻:Oracle9i SQL Reference Release 2 (9.2)
 

..................................................

用String的getBytes方法測試了一下.
結論是utf-8的中文字元佔用3個位元組,gbk的中文字元佔用2個位元組,iso-8859-1的中文字元被識別為佔用2個位元組,iso不支援中文字元的編碼,應該是都當成某個拉丁字母了.Oracle沒有關係,oracle只是負責儲存資料.
可以先用 select * from v$nls_parameters 看看oracle的字元集
下邊是測試的類:

import java.io.UnsupportedEncodingException;

public class TextEncoding
{

/**
*
* @author:sunflower
* @date: 2007-1-24 上午10:09:40
* @todo: 調用的是String的自己的getBytes(encoding)方法,
* 使用指定的字元集將此 String 解碼為位元組序列,並將結果儲存到一個新的位元組數組中.
* @param content
* @param encode
* @return
*/
public static byte[] getBytes(String content,String charsetName)
throws UnsupportedEncodingException{
return content.getBytes(charsetName);
}

/**
*
* @author:sunflower
* @date: 2007-1-24 上午10:19:40
* @todo: 調用的是String的自己的getBytes()方法,
* 使用平台預設的字元集將此 String 解碼為位元組序列,並將結果儲存到一個新的位元組數組中。
* @param content
* @return
*/
public static byte[] getBytes(String content){
return content.getBytes();
}

public static void main(String[]args){
String content="1e寶寶";
byte[] len;
try{
len=getBytes(content,"UTF-8");
System.out.println(" the byte array length is "+len.length);
len=getBytes(content,"GBK");
System.out.println(" the byte array length is "+len.length);
len=getBytes(content,"ISO-8859-1");
System.out.println(" the byte array length is "+len.length);
}catch(Exception e){
System.out.println("Can 't recognize");
}

// System.out.println("the content byte[] length is "+);
}

}

輸出 :
the byte array length is 8
the byte array length is 6
the byte array length is 4

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1492768

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

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.