我先说下场景,数据库定义的长度是VARCHAR2(100),文件数据有一个字段有40个字符,UTF-8编码的非英文字符,如果在插入数据库的时候如果使用String的length()方法去获取长度大小肯定是40.这里40长度肯定是小于数据库大小100,通过了验证,但是插入数据库会出现,值过大。
这里是我说下俩个解决办法:
1.将VARCHAR2(100),字节100,改VARCHAR(CHAR 100) 字符100.
2,在JAVA判断长度的时候,修改获取长度的方法,得到字符串的实际占用字节空间长度。
第一种方法增加了表的实际占用长度,本人不喜欢这么做,因为最初的业务规定长度,但是文件没有按规定来提供,可以认定为错误数据,单独放到错误表中进行记录。
如果表所有的字段都设计成VARCHAR(CHAR),表的占用空间增加。
第二种方法,主要是如何得到字符串的实际占用字符空间长度,GBK和GB2312字符集,每个中文都是占用2个字节,UTF-8字符集,每个中文都是3个字节。英文在以上编码下都是单字节。JAVA中String的length方法是按字符获取的,并非字节。
看下具体的代码:
/**
* 根据字符编码得到字符串实际占用长度
*/
public static int getStringLength(String str,String encoding) throws UnsupportedEncodingException{
if(isNullOrEmpty(str))
return 0;
else
return str.getBytes(encoding).length;
}
/**
* 判断字段是否为空
* @return true 为空, false 不为空
*/
public static boolean isNullOrEmpty(String str){
return null == str || "".equals(str);
}
测试代码:
public static void main(String[] args) throws UnsupportedEncodingException {
String str = "中国111";
System.out.println("utf-8:" +getStringLength(str,"utf-8"));
System.out.println("gbk:"+getStringLength(str,"gbk"));
System.out.println("utf-16:"+getStringLength(str,"utf-16"));
System.out.println("ISO-8859-1:"+getStringLength(str,"ISO-8859-1"));
}
输出:
utf-8:9
gbk:7
utf-16:12
ISO-8859-1:5
本文探讨了在UTF-8编码下,如何准确测量字符串的实际字节长度,以确保符合数据库VARCHAR2字段的长度限制。通过两种方法解决:调整数据库字段类型或在Java中实现正确的字符串长度计算。
608





