当前位置: 首页 > article >正文

Java中String的length与Oracle数据库中VARCHAR2实际存储长度不一致的问题

目录

一、根本原因

二、解决方案


一、根本原因

Oracle数据库新增数据的时候报如下错误:

先给大家看个小案例,这样更好去理解,下面是一段测试代码:

这里面我分别列举了三种字符串,中文,英文和数字以及两种不同的编码方式(GBK和UTF-8),打印结果如下:

可以很直观的看出来Java中的String对象的length()方法返回字符串的字符数量,而不是字节数。

其次在不同的字符编码中,字符所占用的字节数是不同的。下面是GBK和UTF-8编码下,中文、英文和数字字符所占用的字节数:

1. GBK编码

中文字符:通常占 2个字节。

英文字符(ASCII范围内):占用1个字节。

数字字符(0-9):占用1个字节。

2.UTF-8编码

中文字符:通常占用3个字节(对于大多数中文字符)。

英文字符(ASCII范围内):占用1个字节。

数字字符(0-9):占用1个字节。 

所以,Oracle中的VARCHAR2可以存储的汉字数量取决于我们数据库使用的编码方式。

执行如下语句可以查询我们数据库的编码方式:

select userenv('language') from dual;

举个例子:

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

UTF-8编码:如果数据库使用的是UTF-8编码,那么每个汉字占用3个字节。在这种情况下,VARCHAR2(100)最多能存储33个汉字。

注:Oracle数据库length方法获取的也是字符串的字符数量,如下图所示:

二、解决方案

其实只要在插入之前给字符串进行一下判断就行,比如我们数据库用的是GBK的编码方式,格式为VARCHAR(1),那么实例代码参考如下:

if(str.getBytes("gbk").length < 1){
   
}

http://www.kler.cn/a/373741.html

相关文章:

  • 域名重定向后网址打不开的原因及解决方法
  • 的多线程 V5
  • Oracle数据泵(expdp)导入导出数据
  • JAVA多线程--CAS补充
  • Date工具类详细汇总-Date日期相关方法
  • 一些有用的科研数据网站
  • 【优选算法篇】前缀之美,后缀之韵:于数列深处追寻算法的动与静
  • 面试题:JVM(一)
  • 类和对象(中)—— 类的六个默认成员函数
  • 【面试题】Node.JS篇
  • 「MinIO快速入门」
  • nginx------正向代理,反向代理生产,以及能否不使用代理详解
  • SpringBoot + Shiro权限管理
  • Linux下EDAC功能介绍
  • Linux第二讲:Linux权限理解
  • 若依框架部署到服务器后头像资源访问404
  • 图片懒加载(自定义指令)
  • 共享内存相关知识点
  • 架构师备考-数据库基础
  • 安科瑞AM5SE-IS 防逆流保护装置 功能全面 逆功率保护
  • Linux安装部署数据库:MongoDB
  • Redis高级篇之bigKey理论介绍以及优化
  • STATCOM静止同步补偿器原理及MATLAB仿真模型
  • Windows1学习笔记
  • 易考八股文之SpringBoot的启动流程
  • 【UBuntu20 配置usb网卡】 记录Ubuntu20配置usb网卡(特别是建立热点)