解决JAVA字符串长度与数据库字符串长度不一致问题

本文探讨了在UTF-8编码下,如何准确测量字符串的实际字节长度,以确保符合数据库VARCHAR2字段的长度限制。通过两种方法解决:调整数据库字段类型或在Java中实现正确的字符串长度计算。

我先说下场景,数据库定义的长度是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

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值