`

【转】java String类型数据的字节长度

 
阅读更多

问题描述:

        向数据库中插入一条String类型的数据,在数据库中该字段定义为varchar2(64),一开始使用String.length()来进行数据的长 度校验,如果数据是纯英文,那么是没有问题的,但是如果数据中包含中文,校验可以通过,但是在数据入库时经常会报数据超长。

 

问题分析:

        既然问题是数据超长,那么问题应该就是出在数据长度校验上,也就是出在String.length()这个方法上,来看看jdk是如何描述这个方法的:

length
public 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串的字符长度,但是数据库中却是以字节来判断数据长度的(varchar2)。如果String串为纯 英文,那么一个英文字母是一个字符,长度为1,占1个字节,是不会出错的,但是如果String串中包含中文,一个中文汉字也是一个字符,长度为1,但是 却占多个字节(具体占几个字节跟使用的编码有关),那么如果数据中包含中文,数据的长度就很有可能会超过数据库中对应字段的长度限制。

 

解决方式:

        既然是判断数据长度时以字符为标准导致出错,那么思路就很明确了,在进行数据长度校验时,取数据的字节长度:

 

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编码,既然数据最终是要存到数据库中,那么首先先要保证数据在程序中时、在数据库 中时的编码一致(同一个字符在不同的编码格式中所占的字节位数不一致,这点很关键),然后再保证程序和数据库判断数据长度的方式一致,才能避免程序校验通 过,入库时却提示数据长度超长的问题。

 

转自 http://blog.csdn.net/a19881029/article/details/7902701

分享到:
评论

相关推荐

    Java字符串前面或后面补0(适用于等不同长度比较) .txt

    Java字符串长度不够,将其前面补0或者后面补0,适用于字典序比较前,将要比较字符串的位数保持一致,再进行比较。

    Java 自学宝典 第二章 数据类型

    Java的整数数据类型:内存和长度 12 2. 3. 2. 整数计算 12 2. 3. 3. 二进制和十进制值表 12 2. 3. 4. 十六进制数和相应的十进制和二进制值 13 2. 4. 字节 13 2. 4. 1.使用字节数据类型 13 2. 5. Short 14 2. 5. 1. ...

    java实现对图片的压缩上传

    1、得到有效文件的长度(即大小),以字节表示 getFileSize(String filePath),需要传入文件路径 2、可以上传图片与非图片文件。有二个重构方法 一、无限制文件大小上传upLoad(String uploadPath,String filePath,...

    java jdk实列宝典 光盘源代码

    转换基本数据类型;运算符;计算阶乘; 2 复数类;java的参数传递;自定义形状类;类的加载顺序;方法和变量在继承时的覆盖和隐藏;排序类; 3数字 数字类;格式化数字;转换数字进制;生成随机数; 4数组和集合 ...

    Java中文字符所占的字节数

    我们可以通过String类的getBytes(String charsetName)方法来获取到字符串以指定编码方式编码后所得到的字节数组,然后字节数组的长度是该字符串在指定编码方式下所占的字节数。下面为一个测试示例:   ...

    netty websocket通讯接收数据不完整问题

    这是一个java web项目集成了netty websocket的...初始化握手对象时指定了maxFramePayloadLength 的长度、以及通过配置netty内置解码器处理数据半包等方法,均无效。以下是终极解决办法,供大家参考和解决这样的问题。

    Java之IO流学习总结

    根据处理数据类型的不同分为:字符流和字节流 根据数据流向不同分为:输入流和输出流 字符流和字节流 字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查...

    java综合试题(面试题)

    13. Java语言中的浮点型数据根据数据存储长度和数值精度的不同,进一步分为哪两种具体类型,各占二进制的多少位? 16.字符串 ”\’a\’” 的长度是( )3 13. float 32位、double 64位 24.表达式2*5/2.5、1.0/2*5、...

    java 编写文件上传类简单易用

    int bytesLen(String s) 返回字符串转化为字节数组后,字节数组的长度 这样,从一个字节数组中,根据标记提取出另一个字节数组可以表示如下: 假设我们已经将数据存入字节数组 buffer 中,分界符存入 ...

    8583报文解析框架Simple8583.zip

    6)通过Socket将数据发送并接受响应(读取前两个字节长度,根据长度获取其剩余报文),根据IsoPackage解析报文域,解析得到BitMap后根据BitMap对数据域进行解析,并将值都放入到对应的field中 7)将数据都放在Map...

    java字符串操作大全

     (6)、append() 可把任何类型数据的字符串表示连接到调用的StringBuffer对象的末尾。  例:int a=42;  StringBuffer sb=new StringBuffer(40);  String s=sb.append("a=").append(a).append("!").toString();...

    delphi与java 加密解密 DES/CBC/PKCS5Padding

    一般设置keystr,ivstr相同,内容为八位字节长度的字符串,编码结果为十六进制字串} interface uses Windows,SysUtils; type PKey64 = ^TKey64; TKey64 = array [0..7] of Byte; type TDESBlock = array[0..7...

    java cmpp2.0 3.0 无jar纯源码demo(含服务端测试工具)[20171205]

    java cmpp2.0 3.0 无jar纯源码demo(含服务端测试工具)[20171205] ...//信息长度(Msg_Fmt值为0时:个字节;其它个字节) private byte[] Msg_Content;//信息内容 private String Reserve="";//保留

    疯狂JAVA讲义

    第3章 数据类型和运算符 38 3.1 注释 39 3.1.1 单行注释和多行注释 39 3.1.2 文档注释 40 学生提问:API文档是什么? 40 学生提问:为什么要掌握查看API文档的方法? 42 3.2 标识符和关键字 45 3.2.1 分隔符 ...

    Java网络编程-Socket-文件传输小案例

    //读取一个字节,获得文件头信息,判断发送信息类型(head or body) switch (cmd) { case 0x1: { ///文件信息 if (buflen >= 260) { FileSize = buf.getInt(); //获取文件大小 byte[] filename = new byte[255]; ...

    java 面试题 总结

    Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。 原始类型封装类 booleanBoolean charCharacter byteByte shortShort intInteger longLong floatFloat doubleDouble ...

    java面试宝典

    3、String 是最基本的数据类型吗? 8 4、float 型float f=3.4是否正确? 8 5、语句float f=1.3;编译能否通过? 8 6、short s1 = 1; s1 = s1 + 1;有什么错? 8 7、Java 有没有goto? 8 8、int 和Integer 有什么区别? 9 9...

    JAVA--达内培训笔记

    java中没有sizeof这个关键字了,java中的boolean类型的值只能用true和false,且这两个也是关键字 enum 枚举 assert 断言 一个标识符尽量符合语义信息,提高程序可读性 类 名 :每个单词首字母大写, 变量和...

    java范例开发大全源代码

     第2章 Java基础类型与运算符(教学视频:39分钟) 9  2.1 基础类型 9  实例2 自动提升 9  实例3 自动转换 10  实例4 常用基础类型之强制转换 11  2.2 运算符 12  实例5 算术运算符 12  实例6...

    java范例开发大全

    第2章 Java基础类型与运算符(教学视频:39分钟) 9 2.1 基础类型 9 实例2 自动提升 9 实例3 自动转换 10 实例4 常用基础类型之强制转换 11 2.2 运算符 12 实例5 算术运算符 12 实例6 关系运算符 13 实例7 逻辑...

Global site tag (gtag.js) - Google Analytics