字段超长问题:中文字符不一定都是占2个字节

简介:

在Oracle中,经常把字段的类型设置成varchar2。

以前都是认为每一个中文字符都是占用2个字节,即varchar2(30)只能存放15个中文或30个英文。

今天偶然发现,这个其实和Oracle的配置是相关的,用以下语句查询:
   select * from v$nls_parameters t where t.PARAMETER='NLS_CHARACTERSET';
可以查询到当前数据库的字符集,如果value=GB2312,那么一个汉字占用2个字节,如果value=AL32UTF8,那么一个汉字占用3个字节。

在Java中可以使用以下方式取得string的长度:

     private   int  getLength(NcsTextField t)  {
        
try {
            
int iLength = new String(t.getText().getBytes("UTF8"),"iso-8859-1").length();
            
return iLength;
        }
 catch (Exception e) {
            
return t.getText().length();
        }

    }
这样取得的一个汉字占3个字节,

如果把UTF8换成GB2312则一个汉字占2个字节



    本文转自永春博客园博客,原文链接:http://www.cnblogs.com/firstyi/archive/2007/09/18/897542.html,如需转载请自行联系原作者

相关文章
单字节,双字节,四字节能够表示的数值大小范围分别是多少
单字节,双字节,四字节能够表示的数值大小范围分别是多少
|
6月前
|
存储
汉字和数字站几个字节,估算内存占用情况
该文内容讲述了字符和字节的关系:中文标点占3字节,英文字母或数字占1字节,英文标点也占1字节。1字节等于8字位,1字位是1个二进制数。此外,还介绍了存储单位的换算:1B=8b,1KB=1024B,1MB=1024KB,1GB=1024MB。其中,b代表字位,B代表字节,KB是千字节,MB是兆字节,GB是吉字节。
163 2
|
6月前
ASCII编码字符数量
ASCII编码字符数量
143 2
|
存储 数据处理
位,字节与字
位、字节、字(bits, Bytes, words)是计算机数据存储的单位。位是最小的存储单位,每一个位存储一个1位的二进制码(0 or 1),一个字节由8位(8个二进制0 or 1 串)组成。而字通常为16、32或64个位组成。
809 0
|
监控
中文字节长度引起的数据丢失
最近在写一个应用监控的项目,使用netty作为数据传输。因为刚开始写,没有使用Protobuf之类的作为编码工具,只是使用的是netty自带的LengthFieldBasedFrameDecoder作为报文解析工具,自定义编码解码类,实现数据传输。
161 0
|
Java API
一个汉字占几个字节你真的记住了吗?
一个汉字占几个字节是不是不太好记呢,编码不一样则占字节位就不一样。下面用一段简短的代码了解一下一个汉字占几个字节。
395 0
一个汉字占几个字节你真的记住了吗?
|
存储 关系型数据库 Oracle
设计表的时候,对变长字段长度选择的一点思考
原文:设计表的时候,对变长字段长度选择的一点思考 不管是在MSSQL还是MySQL或者Oracle,变长字段的长度衡量都是要经常面对的。对于一个变长的字段,在满足业务的情况下(其实所谓的满足业务是一个比较模糊的东西),到底是选择varchar(50)还是varchar(200)亦或是varchar(500)?对于保守型选择,往往是选择一个较大的长度,比如varchar(500)要比varchar(50)更具有兼容性,因为是变长字段的原因,存储空间也一样。
1397 0
一个汉字占多少字节?
原文:一个汉字占多少字节? GBK编码,一个汉字占两个字节。 UTF-16编码,通常汉字占两个字节,CJKV扩展B区、扩展C区、扩展D区中的汉字占四个字节(一般字符的Unicode范围是U+0000至U+FFFF,而这些扩展部分的范围大于U+20000,因而要用两个UTF-16)。
2407 0
|
存储
字符与字节有什么区别呢?
1、计算机存储信息的最小单位,称之为位(bit),音译为比特,二进制的一个“0”或一个“1”叫一位。 2、计算机存储容量基本单位是字节(Byte),音译为拜特,8个二进制位组成1个字节。一般而言:一个标准英文字母占一个字节位置,一个标准汉字占二个字节位置。
3628 0