`

【转】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算法

    微信公众平台消息发送接口文档中对消息长度限制为2048字节长度。当需要发送很长的消息内容的时候就需要进行拆分成多条发送。 但是内容中有单字节字符和多字节字符,而且希望在一句话结束或者内容换行的位置进行拆分...

    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习题汇编.docx

    Java 基础知识点汇编 ...这些知识点涵盖了 Java 的基础知识,包括 Java 虚拟机、标识符、变量、数据类型、赋值语句、表达式、方法、注释、数据类型转换、常量、条件运算符、位运算符、数组、字符串和调试等方面。

    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基础试题.docx

    Java 的基本数据类型包括 `byte`、`short`、`int`、`long`、`float`、`double`、`char`、`boolean` 等。 ### 9. 输出语句 能够在屏幕打印的代码是 `System.out.println()`。 ### 10. break 语句 关于 break 语句...

    java基础教程第3版习题解答.doc

    本资源为 Java 基础教程第 3 版习题解答,涵盖了 Java 语言的基本概念、语法、数据类型、运算符、控制流程、方法、数组、字符串等方面的知识点。 变量和数据类型 * 标识符是 Java 中用来标识类名、变量名、方法名...

    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-2实用教程(第5版)习题解答.doc

    Java 语言的基本数据类型有 boolean、char、byte、short、int、long、float、double 等。float 型常量必须用 F 或 f 为后缀,double 型常量用 D 或 d 为后缀,但允许省略后缀。 获取一维数组的长度可以使用数组名....

    疯狂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]; ...

Global site tag (gtag.js) - Google Analytics