解决JAVA字符串长度与数据库字符串长度不一致问题
2015-05-31 15:29
896 查看
我先说下场景,数据库定义的长度是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
这里是我说下俩个解决办法:
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
相关文章推荐
- 疯狂Java学习笔记(62)------------线程初识
- Java基本语法学习时需要注意的几点
- java集合排序
- Java实现二叉排序(查找)树的操作
- java学习之集合框架工具类
- 一款工具助你减少java代码bug
- Java反射基础(二)— Class类
- java io操作整理
- java复习(五)
- Dijkstra算法java现实
- JAVA 文档注释,类的说明,HTML说明文档的生成
- 设置MyEclipse的代码自动提示功能
- 个人认为讲解java异常最好的文章
- SpringMVC介绍之Validation
- Spring2.5学习2.3_如何注入基本类型
- Eclipse Luna安装Activiti Designer报错解决方案
- java线程中run和start方法的区别
- java文件读取全了解
- Vijava 学习笔记(指定虚拟机添加虚拟磁盘修订功能版本)
- 牛客网---java工程师综合练习卷(二星级)---练习改错