標籤:
轉載:http://blog.csdn.net/a19881029/article/details/7902701
問題描述:
向Oracle資料庫中一varchar2(64)類型欄位中插入一條String類型資料,程式使用String.length()來進行資料的長度校 驗,如果資料是純英文,沒有問題,但是如果資料中包含中文,校正可以通過,但是在資料入庫時經常會報資料超長。
問題分析:
既然問題是資料超長,那麼問題應該就是出在資料長度校正上,也就是出在String.length()這個方法上,來看看JDK是如何描述這個方法的:
[plain] view plaincopy
- length
- public int length()返回此字串的長度。長度等於字串中 Unicode 代碼單元的數量。
-
- 指定者:
- 介面 CharSequence 中的 length
- 返回:
- 此對象表示的字元序列的長度。
[java] view plaincopy
- public static void main(String[] args) throws UnsupportedEncodingException {
- String a = "123abc";
- System.out.println(a.length());
- a = "中文";
- System.out.println(a.length());
- }
結果為6和2。這個方法判斷的是String串的字元長度,但是Oracle資料庫中卻是以位元組來判斷varchar2類型資料長度(如: 欄位定義為varchar2(64),則存入該欄位的字串的位元組長度不得超過64)。如果String串為純英文,那麼一個英文字母是一個字元,長度為 1,佔1個位元組,不會出錯,但如果String串中包含中文,一個中文漢字也是一個字元,長度為1,但是卻佔多個位元組(具體占幾個位元組跟使用的編碼有 關),如果資料中包含中文,資料的長度就很有可能會超過資料庫中對應欄位的長度限制
不同資料庫對字串類型資料長度的計算方式不同,如:mysql資料庫中以字元長度來判斷varchar類型資料的長度(如:欄位定義varchar,長度定為64,小數位定義為0,則存入該欄位的字串的字元長度不得超過64)
解決方式:
既然是判斷資料長度時以字元為標準導致出錯,那麼思路就很明確了,在進行資料長度校正時,取資料的位元組長度:
[java] view plaincopy
- public static void main(String[] args) throws UnsupportedEncodingException {
- String a = "123abc";
- int num = a.getBytes("utf-8").length;
- System.out.println(num);
- a = "中文";
- num = a.getBytes("utf-8").length;
- System.out.println(num);
- }
結果為6和6,為什麼轉換成utf-8呢,因為資料庫使用的是utf-8編碼,既然資料最終是要存到資料庫中,那麼首先先要保證資料在程式中時、在 資料庫中時的編碼一致(同一個字元在不同的編碼格式中所佔的位元組位元不一致,這點很關鍵),然後再保證程式和資料庫判斷資料長度的方式一致,才能避免程式 校正通過,入庫時卻提示資料長度超長的問題。
Java String類型資料的位元組長度