字符集合决定varchar2的长度--Oracle定义varchar2()类型存储汉字的长度问题

2023-11-03

oracle 的varchar2(4000)通过jdbc的thin驱动连接为什么只可以存666个汉字?

谁说只能存储666个汉字的?

varchar2最大是4000字节,那么就看你的oracle字符集,如果字符集是16位编码的,ZHS16GBK,那么每个字符16位,2字节,所以可以容纳2000字符。
如果是32位编码的字符集,那么只能存储 1000个字符。

从后面的例子的 length(字符长度)和lengthb(字节长度)的差别就可以看出来了。
create table T_BOARD( NAME      VARCHAR2(50)

insert into      T_BOARD      values ('测试');

select      t.name,length(t.name),lengthb(t.name) from t_board t

 

字符集合决定varchar2的长度

问题描述:
                            intert into T_BOARD      values('超过17个汉字');
                           报错:插入字符过长!发现一个汉字占3个字节,所以报错!!!

问题所在:
                          使用的字符集是UTF8,就有可能出现这个错误!
                          使用命令查看:

SQL> select parameter,value from nls_database_parameters where parameter like 'NLS_CHARACTERSET';

PARAMETER
------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
NLS_CHARACTERSET
AL32UTF8

解决方法:
                          建议使用ZHS16GBK字符集!
                          操作:  
                                  SQL> SHUTDOWN IMMEDIATE;  
                                  SQL> STARTUP MOUNT;
                                  SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
                                  SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
                                  SQL> ALTER DATABASE OPEN;
                                  SQL> ALTER DATABASE CHARACTER SET AL32UTF8/ZHS16GBK;

                                  SQL> SHUTDOWN IMMEDIATE;


                                  SQL> STARTUP;
                
问题解决!!! (改变时注意新的字符集是旧的超集问题)

附注1:

Re: 研究:为什么我的ORACLE的数据操作突然报数量限制的错误(怪)? 发表时间: 2003-12-05 09:25
回复此消息
这是很经典的OracleJDBC问题。一般直接用ps.setString()设置字符串数据时,Oracle的JDBC驱动会将中文转换为2字节或3字节,不固定的,因此经常会越界。
如果你改为ps.setCharacterStream()就是固定的每个中文两个字节

根据oracle的文档,thin的jdbc驱动,会根据字符集合决定varchar2的长度,如果不是ascii或者拉丁字符集合,长度的限制就是2000,因为它认为其他字符集都需要两个字节来存储,但是通过jdbc的setString方法时候,驱动会把java的utf-16转换为utf-8,这样英文由两个字节变成一个字节,中文由两个字节变为3个字节,所以2000/3大概就是666个中文字符了。

附注2:

在做更新操作时,办法:
pstmt.setBytes(4,aimString.getBytes());
取数据时:
new String(resultSet.getBytes("fieldName"),"ISO-8859-1");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

字符集合决定varchar2的长度--Oracle定义varchar2()类型存储汉字的长度问题 的相关文章

  • SQL Server 用分隔符分割字符串

    我有一个输入字符串 100 2 3 101 2 1 103 2 3 我想解析它并将其添加到具有 3 列的表中 因此它应该是 f x col1 col2 col3 100 2 3 类似的其他数据以逗号分隔作为记录和 作为列 Thanks ni
  • 将 UUID 存储为 base64 字符串

    我一直在尝试使用 UUID 作为数据库键 我希望占用尽可能少的字节数 同时仍然保持 UUID 表示形式的可读性 我认为我已经使用 base64 将其减少到 22 个字节 并删除了一些尾随的 这些 对于我的目的来说似乎没有必要存储 这种方法有
  • 分层查询

    我希望我能够解释困扰我的问题 我有以下分层数据集 这只是 34K 记录的子集 PARENT ID CHILD ID EXAM TUDA12802 TUDA12982 N TUDA12982 TUDA12984 J TUDA12984 TUD
  • Oracle - 使用 DBMS_MVIEW.REFRESH 刷新“REFRESH FORCE ON DEMAND”视图时会发生什么

    我有以下物化视图 CREATE MATERIALIZED VIEW TESTRESULT ON PREBUILT TABLE WITH REDUCED PRECISION REFRESH FORCE ON DEMAND WITH PRIMA
  • 列中差异的数量

    我想检索一列每行中有多少个字母的差异 例如 如果您有一个值 test 而另一行有一个值 testing 则 test 和 testing 之间的差异为 4 个字母 该列的数据值为 4 I have reflected about it an
  • Laravel leftJoin 仅右表的最后一条记录

    我是 Laravel 的新手 我有两张桌子 1 产品 2 价格 products id product int p key name varchar prices id price int p key id product int
  • 当所有维度值都具有 100% 重要性时处理多对多维度

    我至少会尽力保持简洁 假设我们正在跟踪一段时间内的账户余额 所以我们的事实表将包含诸如 账户余额情况表 FK 账户ID FK 日期ID Balance 显然你有一个账户维度表 and a 日期维度表 所以现在我们可以轻松地过滤帐户或日期 或
  • 即使使用“autoReconnect=true”,MySql JDBC 也会超时[重复]

    这个问题在这里已经有答案了 有时 我的 Java Tomcat6 Debian Squeeze 应用程序无法与 MySql 服务器通信 Tomcat 应用程序位于前端服务器上 而 MySql 位于单独的 仅限 MySql 的机器上 一个典型
  • 跨多个表进行搜索,并在结果行中显示表名称

    如何构建 SQL 语句以跨多个平面不相关的表运行 并使用选择结果和结果来自的表的名称显示结果 这种情况是这样的 我有几个表 每个表都有相同的列名 这是我从外部各方收到的数据 并将其存储在不同的表中 相同的表看起来像 Table 1 pid
  • 初级SQL部分:避免重复表达式

    我对 SQL 完全陌生 但我们可以说StackExchange 数据浏览器 https data stackexchange com 我只想按信誉列出前 15 位用户 我写了这样的内容 SELECT TOP 15 DisplayName I
  • 在 C#.NET 应用程序中使用 SQL Server 时间数据类型?

    如何使用 SQLtimeSQL Server 2008 中 C NET 中引入的数据类型 我一直在努力让它发挥作用 但没有成功 这是一个MSDN 文章 http msdn microsoft com en us library bb6751
  • 如何将表中不存在但原始SQL中存在的实体字段设置为别名?

    假设我们有一个这样的查询 SELECT CUSTOM EXPRESSION as virtualfield FROM users 用户的实体本身具有 虚拟字段 但映射注释没有 因为表没有该字段 假设它作为原始 SQL 执行 我们如何使用上面
  • 月份增量查询

    我想通过添加 1 个月来更新数据库中的月份 但我不知道如何在以下存储过程查询中添加月份 我不擅长 sql 请检查它 ALTER PROCEDURE dbo ChangePassword password varchar 20 epasswo
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • 将表数据从一个 SQL Server 导出到另一台 SQL Server

    我有两个 SQL Server 都是 2005 版本 我想将多个表从一个表迁移到另一个表 我努力了 在源服务器上 我右键单击数据库 选择Tasks Generate scripts 问题是在下面Table View options没有Scr
  • Google BQ:运行参数化查询,其中参数变量是 BQ 表目标

    我正在尝试从 Linux 命令行为 BQ 表目标运行 SQL 此 SQL 脚本将用于多个日期 客户端和 BQ 表目标 因此这需要在我的 BQ API 命令行调用中使用参数 标志 parameter 现在 我已经点击此链接来了解参数化查询 h
  • 使用间隔阈值对不同的连续时间戳记录进行分组

    我有一系列间歇性间隔的带有时间戳的 GPS 坐标 我正在使用 PostGIS 将它们渲染到地图画布上 为了渲染它们 需要使用 PostGIS 中的 ST MakeLine 聚合函数将点聚合成线 从而在地图上留下 GPS 数据丢失的间隙 数据
  • 在 postgres 查询中使用列表

    我有一个动态列表 list a b c d 所以长度可能会改变 我想在查询中比较这些列表值 select from student where name in all the list values 我想将列表值传递到此查询中 我怎样才能做
  • SQL Server 上的语法错误

    这可能是一个愚蠢的语法错误 但我只是继续阅读我的程序 但我无法弄清楚我的错误在哪里 消息 156 第 15 级 状态 1 第 41 行关键字附近的语法不正确 为了 这是我的代码 alter procedure LockReservation
  • MS ACCESS 计数/求和行数,不重复

    我有下表 我需要计算总行数而不包括任何重复记录 CustomerID test1 test1 test2 test3 test4 test4 如您所见 总行数为 6 但有两个 test1 和两个 test4 我希望查询返回 4 IOW 我想

随机推荐

  • 开源自动化测试平台介绍一览

    以下为小编整理的 各类自动化测试平台 供大家工作中自己参考 一 autotestplat 作者 fin 功能 接口自动化测试 性能测试 appui自动化测试 webui自动化测试 源码 https github com testdevhom
  • TensorRT Samples: MNIST API

    关于TensorRT的介绍可以参考 http blog csdn net fengbingchun article details 78469551 以下是参考TensorRT 2 1 2中的sampleMNISTAPI cpp文件改写的实
  • douyin【商品抢购js脚本】

    文章目录 前言 订阅须知 知识点 源码 前言 脚本主要用来实现抢购douyin商城 直播间秒杀商品等一系列商品 订阅须知 订阅后 只提供js源代码 不提供教学 请根据源码自行抓包 知识点 1 在查询串插入一个固定的键rstr 2 对查询串进
  • Java本地缓存技术选型

    常用的本地缓存 Guava Cache Guava Cache 是 Google 开发的一个 Java 本地缓存库 它提供了一些缓存特性 比如大小限制 自动过期 移除通知等等 Guava Cache 使用的是 LRU Least Recen
  • 如何和AI聊天

    AI产品工具目录 AI产品目录 Prompt 在和AI聊天时 你得表明你需要啥 并且描述的越精确 AI回答的就越贴近你的预期 简单的对话 可以自己尝试 但是如果想做应用级别的就得学习这种聊天技术 如何构建Prompt Prompt 是指用户
  • MySQL生产环境高可用架构实战

    分布式技术MongoDB 1 MySQL高可用集群介绍 1 1 数据库主从架构与分库分表 1 2 MySQL主从同步原理 2 动手搭建MySQL主从集群 2 1 基础环境搭建 2 2 安装MySQL服务 2 2 1 初始化MySQL 2 2
  • Linux Kjournald 进程高IO

    iotop查看各进程占用IO的情况 图片如下 发现 Kjournald IO占用过高 图片未保存 问题原因 由于 Kjournald 进程是ext3系统的日志进程 当ext3系统存在重大变更时 此进程会占高IO df h 查看设备 根据设备
  • 【数据结构】线段树笔记2

    数据结构 零基础线段树笔记1 参考和引用 线段树讲解 本博客主要是这个的笔记 线段树相关知识 线段树的结构 N的原数组 要4N的大小去存储线段树 原因 看线段树讲解吧 代码相关 更新当前节点 push up 是更新当前节点的操作 有两种写法
  • python——飞机大战小游戏

    目录 1 导入模块 2 窗口操作 3 事件操作 4 长按事件 5 添加游戏背景 6 添加英雄飞机 7 获取飞机的图片矩形 8 基本游戏窗口 9 添加游戏窗口图片 10 英雄飞机登场 11 英雄飞机装备子弹并发射 1 enemy plane
  • Pytest系列-数据驱动@pytest.mark.parametrize(7)

    简介 unittest 和 pytest参数化对比 pytest与unittest的一个重要区别就是参数化 unittest框架使用的第三方库ddt来参数化的 而pytest框架 前置 后置处理函数fixture 它有个参数params专门
  • Angular学习笔记68:Angular项目的单元测试 -- 对路由进行测试

    对路由进行测试 对于模版文件中有 的 在TestBed configureTestingModule 的元数据的imports数据一定要加上 RouterTestingModule 属于嵌套到组件中的其他组件 并不是单元测试的重点 第一种处
  • 人工智能知识全面讲解: RBF神经网络

    7 4 1 全连接与局部连接 1968 年 生 物 学 家 休 伯 尔 David Hunter Hubel 教 授 与 维 泽 尔 Torsten N Wiesel 教授在研究动物如何处理视觉信息时有一个重要的发 现 他们发现动物大脑皮层
  • C++知识积累:重载、隐藏和重写的区别

    1 重载 重载 是指同一可访问区内被声明的几个具有不同参数列 参数的类型 个数 顺序不同 的同名函数 根据参数列表确定调用哪个函数 重载不关心函数返回类型 示例 class A public void test int a void tes
  • 推荐一款vs编辑器画图插件

    插件名称 jdraw io 创建文件的后缀要写成 jdraw形式 效果
  • [QT编程系列-3]:C++图形用户界面编程,QT框架快速入门培训 - 2- QT程序的运行框架:HelloWorld、常见控件、对象树原理

    目录 2 QT程序的运行框架 2 1 Hello World程序框架 2 2 QT Designer初识 2 3 用QT Designer设计用户登录界 2 QT程序的运行框架 2 1 Hello World程序框架 上述示例代码中 首先根
  • 小白想学好计算机网络 必须知道一下几大基础知识

    引言 大家好 通过前面章节的学习 我们了解到计算机网络的发展过程 知道了计算机网络的概念以及计算机网络的各种分类 文章 但俗话说没有规矩不成方圆 一个企业要想正常运行需要制定各种各样的规章制度 员工需要遵守员工百度收录批量查询的各种企业规范
  • python小脚本——批量将PDF文件转换成图片

    语言 python 3 用法 选择PDF文件所在的目录 点击 确定 后 自动将该目录下的所有PDF转换成单个图片 图片名称为 pdf文件名 page 序号 jpg 如运行中报错 需要自行根据报错内容按照缺失的库 例如 安装库 pip ins
  • 数据在内存中的存储总结

    数据类型介绍 基本内置类型分别为 char 字符数据类型 short 短整型 int 整形 long 长整型 long long 更长的整形 float 单精度浮点数 double 双精度浮点型 注意 C语言中没有字符串类型 类型的意义 1
  • Ubuntu 22.04 LTS安装ROS2 (ros-humble-desktop)

    本文记录Ubuntu 22 04虚拟机上安装ROS2的过程以及遇到的问题 1 确定Ubuntu和ROS版本 Ubuntu和ROS2存在一个版本的对应关系 具体可以看官网的这个页面 REP 2000 ROS 2 Releases and Ta
  • 字符集合决定varchar2的长度--Oracle定义varchar2()类型存储汉字的长度问题

    oracle 的varchar2 4000 通过jdbc的thin驱动连接为什么只可以存666个汉字 谁说只能存储666个汉字的 varchar2最大是4000字节 那么就看你的oracle字符集 如果字符集是16位编码的 ZHS16GBK