Java String类型数据的字节长度

摘要:
长度等于字符串中Unicode代码单元的数量。[java]viewplaincopypublicstaticvoidmaintthrowsUnsupportedEncodingException{Stringa=“123abc”;System.out.println;a=“Chinese”;System.eout.prindln;}结果是6和2。该方法判断字符串的字符长度,但Oracle数据库使用字节来判断varchar2数据的长度。

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

问题描述:

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

问题分析:

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

  1. length
  2. publicintlength()返回此字符串的长度。长度等于字符串中Unicode代码单元的数量。
  3. 指定者:
  4. 接口CharSequence中的length
  5. 返回:
  6. 此对象表示的字符序列的长度。
  1. publicstaticvoidmain(String[]args)throwsUnsupportedEncodingException{
  2. Stringa="123abc";
  3. System.out.println(a.length());
  4. a="中文";
  5. System.out.println(a.length());
  6. }

结果为6和2。这个方法判断的是String串的字符长度,但是Oracle数据库中却是以字节来判断varchar2类型数据长度(如: 字段定义为varchar2(64),则存入该字段的字符串的字节长度不得超过64)。如果String串为纯英文,那么一个英文字母是一个字符,长度为 1,占1个字节,不会出错,但如果String串中包含中文,一个中文汉字也是一个字符,长度为1,但是却占多个字节(具体占几个字节跟使用的编码有 关),如果数据中包含中文,数据的长度就很有可能会超过数据库中对应字段的长度限制

不同数据库对字符串类型数据长度的计算方式不同,如:mysql数据库中以字符长度来判断varchar类型数据的长度(如:字段定义varchar,长度定为64,小数位定义为0,则存入该字段的字符串的字符长度不得超过64)

解决方式:

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

  1. publicstaticvoidmain(String[]args)throwsUnsupportedEncodingException{
  2. Stringa="123abc";
  3. intnum=a.getBytes("utf-8").length;
  4. System.out.println(num);
  5. a="中文";
  6. num=a.getBytes("utf-8").length;
  7. System.out.println(num);
  8. }

结果为6和6,为什么转换成utf-8呢,因为数据库使用的是utf-8编码,既然数据最终是要存到数据库中,那么首先先要保证数据在程序中时、在 数据库中时的编码一致(同一个字符在不同的编码格式中所占的字节位数不一致,这点很关键),然后再保证程序和数据库判断数据长度的方式一致,才能避免程序 校验通过,入库时却提示数据长度超长的问题。

免责声明:文章转载自《Java String类型数据的字节长度》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇oracle 内置函数C# DataGridView显示行号的三种方法 (转载)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

oracle 字符集

影响Oracle数据库字符集最重要的参数是NLS_LANG参数。 它的格式如下: NLS_LANG = language_territory.charset 它有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。 其中: Language: 指定服务器消息的语言, 影响提示信息是中文还是英文 Territory: 指定服务器的日期和数字格...

maven 命令小记

mvn help:system mvn clean compile mvn clean test                            测试 mvn clean package                    打包成jar mvn clean install mvn dependency:tree 列出jar之间依赖引入的jar ma...

Java多次启动相同jar程序

背景现在很多软件都支持集群部署,但是测试环境通常资源有限,所以一般通过单台机器模拟集群部署(使用不同端口,运行相同jar包),本文的目的就是通过多种方式实现此需求。 两个程序1、jar程序   ① springboot程序   ② 只包含一个main方法,用于启动程序,输出进程ID   ③ 路径:C:/demo.jar(windows) /demo.jar...

javascript base64 编码,兼容ie6789

用Javascript进行base64编码,在高版本的IE浏览器(IE9以上版本),和firefox,chrome浏览器里是非常方便的。这些浏览器的window对象中内置了base64的编码和解码方法。 var base64String = window.btoa(string) ;//编码 var string = window.atob(base64s...

mailkit库收发邮件

mailkit库用于收发邮件.这个库可以替代C#自带的发邮件库 环境  W10 / VS2017CMMT / MailKit version="2.0.3" "net46"  / MimeKit version="2.0.3" "net46" mailkit使用nuget下载或者到GIT  https://github.com/jstedfast/Mail...

C#字符串和ASCII码的转换

C# 字符转ASCII码,ASCII码转字符 //字符转ASCII码:public static int Asc(string character) {if (character.Length == 1) { System.Text.ASCIIEncoding asciiEncoding = new System.Text.ASCIIEnco...