字符集合决定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 2008 如何使用全文搜索来实际找到精确的字符串匹配 我对此感到非常困难 而且我在网上找不到令人满意的解决方案 例如 如果我正在搜索字符串 Bojan Skrchevski 我希望第一个结果正是如此 到目前为止
  • Azure COSMOS DB 如何查询数组中的内容

    如何进行查询以获取文档数组 roles 中包含某些内容的文档 我想获取以下文档 其中 Trainer 是数组中的元素 enabled true profilePicture null roles Trainer Client SELECT
  • 如何以编程方式使用包含多列的 where-in 子句执行 PostgreSQL 查询?

    我的查询是这样的 select from plat customs complex where code t code s in 01013090 10 01029010 90 它在 psql 控制台中运行良好 我的问题是如何在客户端代码中
  • 显示包含特定表的所有数据库名称

    我的 SQL Server 中有很多数据库 我必须只搜索包含特定表名的数据库名称Heartbitmaster 我有很多数据库 例如Gotgold DVD等 我只想从包含此表的查询中查找数据库名称Heartbitmaster 我搜索我尝试查询
  • mysql 在 sum() 函数上使用 concat,例如 concat(sum(col1),"%")

    我正在尝试合并多个查询 但其中一个查询使用 sum 当我尝试在此列上应用 concat 时 我得到不需要的 blob 结果 我如何在聚合列上应用 concat 和 union 我期待这个结果 SELECT row 1 col1 UNION
  • 将错误保存到 MySQL 数据库

    我有一个 php 查询来更新 MySQL 数据库 请参见下文 sql update hr payroll set payroll number payroll number tax code tax bacs ref bacs ref pa
  • sqlldr.exe 不适用于 Windows 10

    我最近通过自定义安装安装了 Oracle 数据库客户端 12 1 0 2 0 winx64 并仅选择包括 SQL Loader 等在内的数据库实用程序 但是当我尝试执行 sqlldr exe 时 出现以下错误 在网上搜索后 我从所有站点 即
  • PostgreSQL:有效地将 JSON 数组拆分为行

    我有一个表 表 A 其中包含一个包含 JSON 编码数据的文本列 JSON 数据始终是一个包含一到几千个普通对象的数组 我有另一个表 表 B 其中有几列 包括数据类型为 JSON 的列 我想从表 A 中选择所有行 将 json 数组拆分为其
  • 如何使用内联 SQL 参数化 IN 语句的集合? [复制]

    这个问题在这里已经有答案了 可能的重复 参数化 SQL IN 子句 https stackoverflow com questions 337704 parameterizing a sql in clause 你好 我有一个查询 如下所示
  • 选定的非聚合值必须是关联组的一部分

    我在 Teradata 中有两个表 Table A 和 Table B 它们之间是 LEFT JOIN 之后我将创建 SELECT 语句 其中包含两个表中的属性 SELECT attribute 1 attribute 2 attribut
  • SQL Server:触发器如何读取插入、更新、删除的值

    我在一张表中有触发器并且想阅读UserId插入 更新或删除行时的值 怎么做 下面的代码不起作用 我收到错误UPDATED ALTER TRIGGER dbo UpdateUserCreditsLeft ON dbo Order AFTER
  • 返回年份数组作为年份范围

    我正在尝试查询一个包含以下内容的表character varying 年份列 并将这些年份作为逗号分隔的年份范围字符串返回 年份范围将由数组中存在的连续年份确定 不连续的年份 年份范围应以逗号分隔 数据类型的原因是character var
  • MySQL #1093 - 您无法在 FROM 子句中指定用于更新的目标表“赠品”

    I tried UPDATE giveaways SET winner 1 WHERE ID SELECT MAX ID FROM giveaways 但它给出了 1093 您无法指定目标表 赠品 进行更新FROM clause 本文 ht
  • 交换 ms-sql 表

    我想以尽可能最好的方式交换到桌子 我有一个 IpToCountry 表 并根据导入的外部 CSV 文件每周创建一个新表 我发现进行切换的最快方法是执行以下操作 sp rename IpToCountry IpToCountryOld go
  • Oracle内置函数元数据

    有没有办法获取 Oracle 内置聚合和其他功能的元数据 例如AVG STDDEV SQRT ETC 我需要知道对象 id 和参数元 In the SYS ALL OBJECTS查看我找不到任何有用的东西 我也尝试过搜索SYS ALL AR
  • 如何修复“Oracle.EntityFrameworkCore 类型中的方法‘get_Info’没有实现”。

    我正在尝试通过 EW 连接到 Oracle DB 论方法OnConfiguring是错误 System TypeLoadException 程序集 Oracle EntityFrameworkCore Version 2 0 19 1 Cu
  • 什么会导致 Oracle ROWID 更改?

    AFAIK Oracle 中的 ROWID 表示相应数据文件中记录的物理位置 在什么情况下记录的ROWID可能会改变 我所知道的一个是分区表上的更新 它将记录 移动 到另一个分区 还有其他情况吗 我们的大多数数据库都是 Oracle 10
  • 无重复组合的交叉连接

    我知道这个问题与这个问题非常相似 对称交叉连接 https stackoverflow com questions 12490244 symmetric cross join还有这个 sql 中交叉连接的组合 不是排列 https stac
  • 有没有办法在插入查询中执行另一个查询?

    好的 这是我的查询 我刚刚添加了 ACCOUNTID 和 accountID 部分 这显然不起作用 INSERT INTO Leads LEADID CREATEUSER CREATEDATE FIRSTNAME MODIFYDATE AC
  • 在 SQL Server 中通过标准差消除异常值

    我试图通过标准差消除 SQL Server 2008 中的异常值 我只想要特定列中包含该列平均值的 1 标准差范围内的值的记录 我怎样才能做到这一点 如果您假设事件呈钟形曲线分布 则只有 68 的值与平均值相差 1 个标准差以内 95 的值

随机推荐

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

    以下为小编整理的 各类自动化测试平台 供大家工作中自己参考 一 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