Java String类型数据的字节长度
来源:互联网 发布:it公司 知乎 编辑:程序博客网 时间:2024/05/22 03:20
问题描述:
向Oracle数据库中一varchar2(64)类型字段中插入一条String类型数据,程序使用String.length()来进行数据的长度校验,如果数据是纯英文,没有问题,但是如果数据中包含中文,校验可以通过,但是在数据入库时经常会报数据超长。
问题分析:
既然问题是数据超长,那么问题应该就是出在数据长度校验上,也就是出在String.length()这个方法上,来看看JDK是如何描述这个方法的:
lengthpublic int length()返回此字符串的长度。长度等于字符串中 Unicode 代码单元的数量。 指定者:接口 CharSequence 中的 length返回:此对象表示的字符序列的长度。
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)
解决方式:
既然是判断数据长度时以字符为标准导致出错,那么思路就很明确了,在进行数据长度校验时,取数据的字节长度:
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类型数据的字节长度
- JAVA String类型数据的字节长度
- java String类型数据的字节长度
- Java String类型数据的字节长度
- Java String类型数据的字节长度
- 结构体类型数据的字节长度
- Java String类型的长度问题
- java中String类型的最大长度
- long 类型的字节长度
- 不同语言的变量类型及字节长度 (C & Java)
- java获取字节的长度
- java获取字节的长度.
- java计算String类型的数据
- JAVA字节数据与JAVA类型的转换
- [转]JAVA字节数据与JAVA类型的转换
- oracle取得数据的长度字节数
- 中文字节长度引起的数据丢失
- int类型的数据长度
- AS3多线程快速入门(一):Hello World[译]
- 国外经典网页设计:50个优秀的移动网站设计实例
- 如何在Django中接收JSON格式的数据。
- 详解C中volatile关键字
- OpenCV笔记
- Java String类型数据的字节长度
- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks
- Mac电脑与PC的九大区别
- 由于数据移动,未能继续以 NOLOCK 方式扫描
- AS3多线程快速入门(二):图像处理[译]
- 实现RCP自身的控制台
- [Hadoop源码解读](三)MapReduce篇之Job类
- Linux下的定时器用法
- 1.Strut国际化完成语言切换:界面