Java中String的length为什么与ORA-12899异常中实际值大小不一致

1、原因

这是因为Oracle数据库判断字段插入是否超长是以字节来判断的,而String类length方法获取的是存储的字符数量,顺便提一下Oracle数据库length方法获取的也是存储的字符数量。

2、解决方法

查询数据库所用的编码

select  userenv('language')  from  dual

根据数据库所使用的编码获取对应的字节长度再进行判断

"哈哈哈哈".getBytes("gbk").length

3、知识复习

Oracle中的VARCHAR2(100)可以存储的汉字数量取决于数据库使用的编码方式。具体来说:

  • GBK编码:如果数据库使用的是GBK编码,那么每个汉字通常占用2个字节。在这种情况下,VARCHAR2(100)最多能存储50个汉字。
  • UTF8编码:如果数据库使用的是UTF8编码,那么每个汉字通常占用3个字节。在这种情况下,VARCHAR2(100)最多能存储33个汉字。

需要注意的是,VARCHAR2数据类型的长度限制以字节为单位,而不是字符单位。这是因为不同字符可能占用不同的字节数,尤其是在多语言环境中。例如,英文字符通常只占用1个字节,而汉字在GBK编码下占用2个字节,在UTF8编码下则占用3个字节。

此外,VARCHAR2的最大长度是4000字节。如果定义了VARCHAR2(100 CHAR),则表示可以存储最多100个字符,而不是字节,这时可以存储的汉字数量将取决于实际字符所占用的字节数。

在Java中,一个字符可能占用多个字节,这取决于字符的编码方式。例如,在使用UTF-8编码时,一个英文字符通常占用1个字节,而一个汉字可能占用3个字节。如果我们想要获取字符串的字节大小,我们需要根据字符串的编码格式来转换。这通常涉及到将字符串转换为字节数组,然后统计字节数组的长度。

  • 字符串到字节:

将字符串转换为字节,通常称为编码(Encode)。
编码操作可以根据字符编码方案将字符串转换为字节序列,例如将 Unicode 字符串转换为 UTF-8 字节序列。

  • 字节到字符串:

将字节转换为字符串,通常称为解码(Decode)。
解码操作是将字节序列按照特定的字符编码方案转换为对应的字符串,例如将 UTF-8 字节序列解码为 Unicode 字符串。

不同的编码和解码方案被用于不同的字符串和字节转换需求。

  • 常见的编码和解码方案包括 ASCII、Unicode 和 UTF-8 等。
  • 选择合适的编码和解码方案取决于数据的特性和应用场景。
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值