Oracle 不同字符集复合索引长度验证
Oracle 不同字符集复合索引长度验证
背景
前段时间同事找到一个参数, 可以解决Oracle的char和byte 模式存储超长的问题.
很大程度上解决了研发修改SQL的工作量.
但是发现在某些字符集下面会出现一些异常情况.
所以想学习和处理一下.
需要说明我的数据库版本是 Oracle 19.21.0.0
采取多 字符集的PDB模式进行
CDB的字符集是 AL32UTF8
Ora19cutf8 的字符集是 AL32UTF8
Ora19ccesu8 的字符集是 UTF8
参数设置
alter system set nls_length_semantics='BYTE' scope=both;
alter system set nls_length_semantics='CHAR' scope=both;
建议查询方式为:
show parameter SEMAN ;
其他说明:
这个参数是PDB级别生效的, SYSTEM表空间不受影响.
注意修改参数建议重启数据库, 如果是PDB, 可以关闭打开PDB就可以, 能够节约时间.
参数说明
NLS_LENGTH_SEMANTICS参数是一个专为创建CHAR和VARCHAR2两种字符型的列时,
指定使用的字节长度,还是使用字符长度的定义方式,有byte和char两种值,默认为byte。
当设置该参数为BYTE时,定义CHAR列或VARCHAR2列采用字节长度方式;
当设置该参数为CHAR时,定义CHAR列或VARCHAR2列采用字符长度的方式。
该参数对于数据库中已经存在的列不具备任何用途,只是在创建表,或修改表的列时才具有意义。
NLS_LENGTH_SEMANTICS参数的值,不对已经存在的列产生任何影响,只是在创建表中的列时,
默认的指定列长度类型为byte还是char,如果在创建或修改表的列时指定了长度类型,
完全覆盖NLS_LENGTH_SEMANTICS参数的值。
测试方法
虽然可以使用修改数据库参数方式进行相关的处理.
但是根据参数说明里面的 可以再建表的时候 指定 是 char 类型还是 byte 类型
所以其实不需要进行 数据库参数修改了 效率很高.
测试结论
Oracle 的AL32UTF8字符集和UTF8字符集是不太一样的.
在byte 模式下两者的长度限制相同:
单个列长度应该是 6396 可以创建索引
但是如果是两个列的组合索引. 那么长度限制应该是 6393 而不是 6396 这一块需要注意.
在 char 模式下两者的长度限制不相同
AL32UTF8字符集模式下:
组合索引的两个列的合并长度最大是 1598, 如果是 1599 则会报错
符合: 6393/4=1598.25 取整的结果.
UTF8CESU字符集模式下
组合索引的两个列额最大合并长度是 2797 如果是 2798 只报错
但是这个数据没有找到具体的计算方式.
另外需要注意, 如果是单列索引. 都可以制作4000长度的索引. 不会出现报错的情况
差异只存在于 复合索引的情况下
测试结果
注意所有的测试结果 都是 zhaobsh103 创建失败, 其他的索引创建成功. 提示错误信息都一致.
ORA-01450: 超出最大的关键字长度 (6397)
AL32UTF8
DROP TABLE zhaobsh ;
create table zhaobsh (name1 varchar2(1000 char) , name2 varchar2(597 char ),name3 varchar2(598 char ), name4 varchar2(599 char) );
create index zhaobsh101 on zhaobsh(name1,name2) ;
create index zhaobsh102 on zhaobsh(name1,name3) ;
create index zhaobsh103 on zhaobsh(name1,name4) ;
DROP TABLE zhaobsh ;
create table zhaobsh (name1 varchar2(4000 byte) , name2 varchar2(131 byte ),name3 varchar2(2393 byte ), name4 varchar2(2394 byte) );
create index zhaobsh101 on zhaobsh(name1,name2) ;
create index zhaobsh102 on zhaobsh(name1,name3) ;
create index zhaobsh103 on zhaobsh(name1,name4) ;
UTF8CESU
DROP TABLE zhaobsh ;
create table zhaobsh (name1 varchar2(2000 char) , name2 varchar2(131 char ),name3 varchar2(797 char ), name4 varchar2(798 char) );
create index zhaobsh101 on zhaobsh(name1,name2) ;
create index zhaobsh102 on zhaobsh(name1,name3) ;
create index zhaobsh103 on zhaobsh(name1,name4) ;
DROP TABLE zhaobsh ;
create table zhaobsh (name1 varchar2(4000 byte) , name2 varchar2(131 byte ),name3 varchar2(2393 byte ), name4 varchar2(2394 byte) );
create index zhaobsh101 on zhaobsh(name1,name2) ;
create index zhaobsh102 on zhaobsh(name1,name3) ;
create index zhaobsh103 on zhaobsh(name1,name4) ;
Oracle 不同字符集复合索引长度验证的更多相关文章
- oracle复合索引的选择和使用
声明:虽然题目是Oracle.但同样适合MySQL InnoDB索引 在大多数情况下.复合索引比单字段索引好 很多系统就是靠新建一些合适的复合索引.使效率大幅度提高 ...
- Oracle 复合索引设计原理——前缀性和可选性
前缀性: 复合索引的前缀性是指只有当复合索引的第一个字段出现在SQL语句的谓词条件中时,该索引才会被用到.如复合索引为(ename,job,mgr),只要谓词条件中出现第一个字段ename,就可以用复 ...
- 二十、oracle通过复合索引优化查询及不走索引的8种情况
1. 理解ROWID ROWID是由Oracle自动加在表中每行最后的一列伪列,既然是伪列,就说明表中并不会物理存储ROWID的值:你可以像使用其它列一样使用它,只是不能对该列的值进行增.删.改操作: ...
- 【三思笔记】 全面学习Oracle分区表及分区索引
[三思笔记]全面学习Oracle分区表及分区索引 2008-04-15 关于分区表和分区索引(About PartitionedTables and Indexes) 对于 10gR2 而言,基本上可 ...
- 选择ORACLE数据库字符集
如何选择数据库的字符集是一个有争议的话题,字符集本身涉及的范围很广,它与应用程序.客户的本地环境.操作系统.服务器等关系很密切,因此要做出合适的 选择,需要明白这些因素之间的关系.另外对字符集的基本概 ...
- ( 转 ) mysql复合索引、普通索引总结
对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合 ...
- Oracle中查询走索引的情况
1.对返回的行无任何限定条件,即没有where子句 2.未对数据表与任何索引主列相对应的行限定条件例如:在City-State-Zip列创建了三列复合索引,那么仅对State列限定条件不能使用这个索引 ...
- Sql Server之旅——第八站 复合索引和include索引到底有多大区别?
周末终于搬进出租房了,装了宽带....才发现没网的日子...那是一个怎样的与世隔绝呀...再也受不了那样的日子了....好了,既然网 安上去了,还得继续我的这个系列. 索引和锁,这两个主题对我们开发工 ...
- Oracle数据库字符集修改
Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系.ORACLE支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据.一般来说,数据库字符集在安装数据库实例时就 ...
- Oracle外键不加索引会引起死锁问题
转载链接:http://www.jb51.net/article/50161.htm 这篇文章主要介绍了Oracle外键不加索引引起死锁的情况及解决,需要的朋友可以参考下 --创建一个表,此表作为子表 ...
随机推荐
- 『Flutter』开篇
什么是 Flutter Flutter 是由 Google 开发的开源框架 Flutter 用于构建跨平台的移动应用程序 Flutter 它允许开发者使用同一套代码来同时为 IOS 和 Android ...
- STM32CubeMX教程3 GPIO输入 - 按键响应
1.准备材料 开发板(STM32F407G-DISC1) ST-LINK/V2驱动 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) 2 ...
- 11 个步骤完美排查Linux服务器是否被入侵
文章来源公众号:LemonSec 随着开源产品的越来越盛行,作为一个Linux运维工程师,能够清晰地鉴别异常机器是否已经被入侵了显得至关重要,个人结合自己的工作经历,整理了几种常见的机器被黑情况供参考 ...
- k8s 标签-2
目录 标签-2 node的角色 修改node节点的角色,将他的角色修改成他的主机名 标签的作用 Cordon,Drain以及污点 Cordon--告警警戒 Drain 驱逐演示 污点 污点的Cordo ...
- Python 潮流周刊第 35 期(摘要)
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- Navicat 携手华为云GaussDB,联合打造便捷高效的数据库开发和建模工具方案
本文分享自华为云社区<Navicat 携手华为云GaussDB,联合打造便捷高效的数据库开发和建模工具方案>,作者: GaussDB 数据库 . 近日, Navicat Premium顺利 ...
- 视频编码耗时长、编码帧发送失败…DVPP视频编码问题典型案例分析
摘要:本期就分享几个关于DVPP视频编码问题的典型案例,并给出原因分析及解决方法 本文分享自华为云社区<DVPP媒体数据处理视频编码问题案例>,作者:昇腾CANN. DVPP(Digita ...
- 云图说|云数据库GaussDB如何做到卓越性能
摘要:对于数据库来说,性能一直被视为最关键的部分.GaussDB作为华为自主创新研发的分布式关系型数据库,那么华为云数据库GaussDB在提升数据库性能方面都有哪些黑科技呢? 本文分享自华为云社区&l ...
- Spring Cache设计之美,你品,你细品…
摘要:Spring Cache的功能很强大,设计也非常优雅,特别适合缓存控制没有那么细致的场景,比如门户首页,偏静态展示页面,榜单等等 本文分享自华为云社区<品味 spring cache设计之 ...
- webpack性能优化(1):分隔/分包/异步加载+组件与路由懒加载
webpack ensure相信大家都听过.有人称它为异步加载,也有人说做代码切割,那这个家伙到底是用来干嘛的?其实说白了,它就是把js模块给独立导出一个.js文件的,然后使用这个模块的时候,webp ...