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外键不加索引引起死锁的情况及解决,需要的朋友可以参考下 --创建一个表,此表作为子表 ...
随机推荐
- MOSS对话式大型语言模型
MOSS是复旦大学自然语言处理实验室发布的一种类似于ChatGPT的会话语言模型.MOSS能够按照用户的指示执行各种自然语言任务,包括回答问题.生成文本.摘要文本.生成代码等.MOSS还能够挑战错误的 ...
- 1.elasticsearch运行
在docker中运行elasticsearch.kibana 一.MacOs 首先需要安装doceker,提供两种方式,选一种方便的就好 1.命令行安装方式 安装命令行 xcode-select -- ...
- Git commit emoji 对照表
emoji emoji代码 commit说明 (调色板) :art: 改进代码结构/代码格式 ️ (闪电) :zap: 提升性能 (赛马) :racehorse: 提升性能 (火焰) :fire: 移 ...
- 未加载mscorlib.pdb
前言: 早上上班按照正常流程打开Visual Studio,调试本地项目,然后奇怪的是一直提示未加载mscorlib.pdb,导致项目无法正常运行,经过一番折腾最后解决了这个突如其来的bug! 问题重 ...
- 语音识别端到端模型解读:FSMN及其变体模型
摘要:在很长一段时间内,语音识别领域最常用的模型是GMM-HMM.但近年来随着深度学习的发展,出现了越来越多基于神经网络的语音识别模型. 一.概述 在很长一段时间内,语音识别领域最常用的模型是GMM- ...
- 大数据场景下Volcano高效调度能力实践
摘要:本篇文章将会从Spark on Kubernetes 发展历程以及工作原理,以及介绍一下Spark with Volcano,Volcano如何能够帮助 Spark运行地更高效. Spark o ...
- 华为云NFT云宝限量开抢,区块链技术为你的数字资产保驾护航
摘要:正是有这些底层的区块链技术支撑,才能让我们真正的"拥有"独属于自己的NFT数字资产. 本文分享自华为云社区<华为云独家NFT限量开抢,背后的这些技术你都知道吗?> ...
- 手把手带你玩转LiteOS Ping组件
摘要:本期小编为大家带来LiteOS开源版本Ping组件的使用说明,请跟随小编的步伐一起进入探索之旅吧! 本文分享自华为云社区<LiteOS组件尝鲜-玩转Ping>,作者:Lionlace ...
- Mac 向日葵设置
- Intelij IDEA 隐藏 .idea
如图 这两文件夹是 IDEA 自动生成的,在开发过程中用不到它.可以把它隐藏(不在 IDEA中显示),操作如下: OK后,立即生效