Java String類型資料的位元組長度

來源:互聯網
上載者:User

標籤:

轉載:http://blog.csdn.net/a19881029/article/details/7902701

 

問題描述:

        向Oracle資料庫中一varchar2(64)類型欄位中插入一條String類型資料,程式使用String.length()來進行資料的長度校 驗,如果資料是純英文,沒有問題,但是如果資料中包含中文,校正可以通過,但是在資料入庫時經常會報資料超長。

 

問題分析:

        既然問題是資料超長,那麼問題應該就是出在資料長度校正上,也就是出在String.length()這個方法上,來看看JDK是如何描述這個方法的:

[plain] view plaincopy
  1. length  
  2. public int length()返回此字串的長度。長度等於字串中 Unicode 代碼單元的數量。   
  3.   
  4. 指定者:  
  5. 介面 CharSequence 中的 length  
  6. 返回:  
  7. 此對象表示的字元序列的長度。  
[java] view plaincopy
  1. public static void main(String[] args) throws UnsupportedEncodingException {  
  2.     String a = "123abc";  
  3.     System.out.println(a.length());  
  4.     a = "中文";  
  5.     System.out.println(a.length());  
  6. }  

結果為6和2。這個方法判斷的是String串的字元長度,但是Oracle資料庫中卻是以位元組來判斷varchar2類型資料長度(如: 欄位定義為varchar2(64),則存入該欄位的字串的位元組長度不得超過64)。如果String串為純英文,那麼一個英文字母是一個字元,長度為 1,佔1個位元組,不會出錯,但如果String串中包含中文,一個中文漢字也是一個字元,長度為1,但是卻佔多個位元組(具體占幾個位元組跟使用的編碼有 關),如果資料中包含中文,資料的長度就很有可能會超過資料庫中對應欄位的長度限制

不同資料庫對字串類型資料長度的計算方式不同,如:mysql資料庫中以字元長度來判斷varchar類型資料的長度(如:欄位定義varchar,長度定為64,小數位定義為0,則存入該欄位的字串的字元長度不得超過64)

 

解決方式:

        既然是判斷資料長度時以字元為標準導致出錯,那麼思路就很明確了,在進行資料長度校正時,取資料的位元組長度:

[java] view plaincopy
  1. public static void main(String[] args) throws UnsupportedEncodingException {  
  2.     String a = "123abc";  
  3.     int num = a.getBytes("utf-8").length;  
  4.     System.out.println(num);  
  5.     a = "中文";  
  6.     num = a.getBytes("utf-8").length;  
  7.     System.out.println(num);  
  8. }  

結果為6和6,為什麼轉換成utf-8呢,因為資料庫使用的是utf-8編碼,既然資料最終是要存到資料庫中,那麼首先先要保證資料在程式中時、在 資料庫中時的編碼一致(同一個字元在不同的編碼格式中所佔的位元組位元不一致,這點很關鍵),然後再保證程式和資料庫判斷資料長度的方式一致,才能避免程式 校正通過,入庫時卻提示資料長度超長的問題。

Java String類型資料的位元組長度

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.