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 不同字符集复合索引长度验证的更多相关文章

  1. oracle复合索引的选择和使用

    声明:虽然题目是Oracle.但同样适合MySQL InnoDB索引          在大多数情况下.复合索引比单字段索引好     很多系统就是靠新建一些合适的复合索引.使效率大幅度提高      ...

  2. Oracle 复合索引设计原理——前缀性和可选性

    前缀性: 复合索引的前缀性是指只有当复合索引的第一个字段出现在SQL语句的谓词条件中时,该索引才会被用到.如复合索引为(ename,job,mgr),只要谓词条件中出现第一个字段ename,就可以用复 ...

  3. 二十、oracle通过复合索引优化查询及不走索引的8种情况

    1. 理解ROWID ROWID是由Oracle自动加在表中每行最后的一列伪列,既然是伪列,就说明表中并不会物理存储ROWID的值:你可以像使用其它列一样使用它,只是不能对该列的值进行增.删.改操作: ...

  4. 【三思笔记】 全面学习Oracle分区表及分区索引

    [三思笔记]全面学习Oracle分区表及分区索引 2008-04-15 关于分区表和分区索引(About PartitionedTables and Indexes) 对于 10gR2 而言,基本上可 ...

  5. 选择ORACLE数据库字符集

    如何选择数据库的字符集是一个有争议的话题,字符集本身涉及的范围很广,它与应用程序.客户的本地环境.操作系统.服务器等关系很密切,因此要做出合适的 选择,需要明白这些因素之间的关系.另外对字符集的基本概 ...

  6. ( 转 ) mysql复合索引、普通索引总结

    对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合 ...

  7. Oracle中查询走索引的情况

    1.对返回的行无任何限定条件,即没有where子句 2.未对数据表与任何索引主列相对应的行限定条件例如:在City-State-Zip列创建了三列复合索引,那么仅对State列限定条件不能使用这个索引 ...

  8. Sql Server之旅——第八站 复合索引和include索引到底有多大区别?

    周末终于搬进出租房了,装了宽带....才发现没网的日子...那是一个怎样的与世隔绝呀...再也受不了那样的日子了....好了,既然网 安上去了,还得继续我的这个系列. 索引和锁,这两个主题对我们开发工 ...

  9. Oracle数据库字符集修改

    Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系.ORACLE支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据.一般来说,数据库字符集在安装数据库实例时就 ...

  10. Oracle外键不加索引会引起死锁问题

    转载链接:http://www.jb51.net/article/50161.htm 这篇文章主要介绍了Oracle外键不加索引引起死锁的情况及解决,需要的朋友可以参考下 --创建一个表,此表作为子表 ...

随机推荐

  1. Confluence OGNL表达式注入命令执行漏洞(CVE-2022-26134)

    Confluence OGNL表达式注入命令执行漏洞(CVE-2022-26134) 简介 Atlassian Confluence是企业广泛使用的wiki系统.2022年6月2日Atlassian官 ...

  2. Python——第一章:循环语句while

    循环语句可以让我们的代码重复的去执行 while循环: while 条件:        代码 过程: 判断while循环的条件是否为真, 如果真, 执行代码. 然后再次判断条件.....直到条件为假 ...

  3. 云MSP技本功|基于OGG 实现Oracle到Kafka增量数据实时同步

    简介: 在大数据时代,存在大量基于数据的业务.数据需要在不同的系统之间流动.整合.通常,核心业务系统的数据存在OLTP数据库系统中,其它业务系统需要获取OLTP系统中的数据.传统的数仓通过批量数据同步 ...

  4. 在Docker上面安装/启动、运行、挂载MySQL5.7

    下载文档请看:https://hub.docker.com/r/mysql/mysql-server 一.下载镜像 执行命令: docker pull mysql/mysql-server:5.7 查 ...

  5. JavaScript异步编程3——Promise的链式使用

    目录 概述 详论 1️⃣回调地狱 2️⃣Promise实现 参考 概述 在上一篇文章<JavaScript异步编程2--结合XMLHttpRequest使用Promise>中,简要介绍了A ...

  6. 斗罗大陆真3D手游实力上线,带你感受魂兽猎杀的超燃时刻

    摘要:在华为云数据库支撑该游戏的仅两个月内就完成了游戏内测至上线的全流程,业务上线流程缩短50%,并支撑海量游戏用户同时在线,达到了200万的用户预约量,上线首日流水破1000万. "没有废 ...

  7. web自动化测试(3):web功能自动化测试selenium基础课

    继上篇<web自动化测试(1):为什么选择selenium做自动化测试>,本文介绍如selenium使用 做UI自动化测试,需要什么技能 前端相关技术:HTML.XML.JavaScrip ...

  8. 火山引擎DataTester:AB测试技术揭秘及应用分享

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群   在全球软件工程创新峰会上,火山引擎DataTester 研发负责人韩云飞围绕"AB测试:让数据与业务 ...

  9. 企业诊断屋:服饰美妆电商如何用A/B测试赋能业务

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群   随着社会经济复苏,服饰美妆的消费市场回暖,国潮品牌正强势崛起和海外品牌进军,让不断增长的美妆市场竞争更加加剧. ...

  10. Docker SpringBoot Skywalking 8.1 agent

    下载源码包:https://archive.apache.org/dist/skywalking/8.1.0/ -- 创建存放目录 mkdir -p /opt/skywalking -- 进入目录 c ...