Oracle 不同字符集复合索引长度验证


背景

  1. 前段时间同事找到一个参数, 可以解决Oraclecharbyte 模式存储超长的问题.
  2. 很大程度上解决了研发修改SQL的工作量.
  3. 但是发现在某些字符集下面会出现一些异常情况.
  4. 所以想学习和处理一下.
  5. 需要说明我的数据库版本是 Oracle 19.21.0.0
  6. 采取多 字符集的PDB模式进行
  7. CDB的字符集是 AL32UTF8
  8. Ora19cutf8 的字符集是 AL32UTF8
  9. Ora19ccesu8 的字符集是 UTF8

参数设置

  1. alter system set nls_length_semantics='BYTE' scope=both;
  2. alter system set nls_length_semantics='CHAR' scope=both;
  3. 建议查询方式为:
  4. show parameter SEMAN ;
  5. 其他说明:
  6. 这个参数是PDB级别生效的, SYSTEM表空间不受影响.
  7. 注意修改参数建议重启数据库, 如果是PDB, 可以关闭打开PDB就可以, 能够节约时间.

参数说明

  1. NLS_LENGTH_SEMANTICS参数是一个专为创建CHARVARCHAR2两种字符型的列时,
  2. 指定使用的字节长度,还是使用字符长度的定义方式,有bytechar两种值,默认为byte
  3. 当设置该参数为BYTE时,定义CHAR列或VARCHAR2列采用字节长度方式;
  4. 当设置该参数为CHAR时,定义CHAR列或VARCHAR2列采用字符长度的方式。
  5. 该参数对于数据库中已经存在的列不具备任何用途,只是在创建表,或修改表的列时才具有意义。
  6. NLS_LENGTH_SEMANTICS参数的值,不对已经存在的列产生任何影响,只是在创建表中的列时,
  7. 默认的指定列长度类型为byte还是char,如果在创建或修改表的列时指定了长度类型,
  8. 完全覆盖NLS_LENGTH_SEMANTICS参数的值。

测试方法

  1. 虽然可以使用修改数据库参数方式进行相关的处理.
  2. 但是根据参数说明里面的 可以再建表的时候 指定 char 类型还是 byte 类型
  3. 所以其实不需要进行 数据库参数修改了 效率很高.

测试结论

  1. Oracle AL32UTF8字符集和UTF8字符集是不太一样的.
  2. byte 模式下两者的长度限制相同:
  3. 单个列长度应该是 6396 可以创建索引
  4. 但是如果是两个列的组合索引. 那么长度限制应该是 6393 而不是 6396 这一块需要注意.
  5. char 模式下两者的长度限制不相同
  6. AL32UTF8字符集模式下:
  7. 组合索引的两个列的合并长度最大是 1598, 如果是 1599 则会报错
  8. 符合: 6393/4=1598.25 取整的结果.
  9. UTF8CESU字符集模式下
  10. 组合索引的两个列额最大合并长度是 2797 如果是 2798 只报错
  11. 但是这个数据没有找到具体的计算方式.
  12. 另外需要注意, 如果是单列索引. 都可以制作4000长度的索引. 不会出现报错的情况
  13. 差异只存在于 复合索引的情况下

测试结果

  1. 注意所有的测试结果 都是 zhaobsh103 创建失败, 其他的索引创建成功. 提示错误信息都一致.
  2. ORA-01450: 超出最大的关键字长度 (6397)
  3. AL32UTF8
  4. DROP TABLE zhaobsh ;
  5. create table zhaobsh (name1 varchar2(1000 char) , name2 varchar2(597 char ),name3 varchar2(598 char ), name4 varchar2(599 char) );
  6. create index zhaobsh101 on zhaobsh(name1,name2) ;
  7. create index zhaobsh102 on zhaobsh(name1,name3) ;
  8. create index zhaobsh103 on zhaobsh(name1,name4) ;
  9. DROP TABLE zhaobsh ;
  10. create table zhaobsh (name1 varchar2(4000 byte) , name2 varchar2(131 byte ),name3 varchar2(2393 byte ), name4 varchar2(2394 byte) );
  11. create index zhaobsh101 on zhaobsh(name1,name2) ;
  12. create index zhaobsh102 on zhaobsh(name1,name3) ;
  13. create index zhaobsh103 on zhaobsh(name1,name4) ;
  14. UTF8CESU
  15. DROP TABLE zhaobsh ;
  16. create table zhaobsh (name1 varchar2(2000 char) , name2 varchar2(131 char ),name3 varchar2(797 char ), name4 varchar2(798 char) );
  17. create index zhaobsh101 on zhaobsh(name1,name2) ;
  18. create index zhaobsh102 on zhaobsh(name1,name3) ;
  19. create index zhaobsh103 on zhaobsh(name1,name4) ;
  20. DROP TABLE zhaobsh ;
  21. create table zhaobsh (name1 varchar2(4000 byte) , name2 varchar2(131 byte ),name3 varchar2(2393 byte ), name4 varchar2(2394 byte) );
  22. create index zhaobsh101 on zhaobsh(name1,name2) ;
  23. create index zhaobsh102 on zhaobsh(name1,name3) ;
  24. 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. MOSS对话式大型语言模型

    MOSS是复旦大学自然语言处理实验室发布的一种类似于ChatGPT的会话语言模型.MOSS能够按照用户的指示执行各种自然语言任务,包括回答问题.生成文本.摘要文本.生成代码等.MOSS还能够挑战错误的 ...

  2. 1.elasticsearch运行

    在docker中运行elasticsearch.kibana 一.MacOs 首先需要安装doceker,提供两种方式,选一种方便的就好 1.命令行安装方式 安装命令行 xcode-select -- ...

  3. Git commit emoji 对照表

    emoji emoji代码 commit说明 (调色板) :art: 改进代码结构/代码格式 ️ (闪电) :zap: 提升性能 (赛马) :racehorse: 提升性能 (火焰) :fire: 移 ...

  4. 未加载mscorlib.pdb

    前言: 早上上班按照正常流程打开Visual Studio,调试本地项目,然后奇怪的是一直提示未加载mscorlib.pdb,导致项目无法正常运行,经过一番折腾最后解决了这个突如其来的bug! 问题重 ...

  5. 语音识别端到端模型解读:FSMN及其变体模型

    摘要:在很长一段时间内,语音识别领域最常用的模型是GMM-HMM.但近年来随着深度学习的发展,出现了越来越多基于神经网络的语音识别模型. 一.概述 在很长一段时间内,语音识别领域最常用的模型是GMM- ...

  6. 大数据场景下Volcano高效调度能力实践

    摘要:本篇文章将会从Spark on Kubernetes 发展历程以及工作原理,以及介绍一下Spark with Volcano,Volcano如何能够帮助 Spark运行地更高效. Spark o ...

  7. 华为云NFT云宝限量开抢,区块链技术为你的数字资产保驾护航

    摘要:正是有这些底层的区块链技术支撑,才能让我们真正的"拥有"独属于自己的NFT数字资产. 本文分享自华为云社区<华为云独家NFT限量开抢,背后的这些技术你都知道吗?> ...

  8. 手把手带你玩转LiteOS Ping组件

    摘要:本期小编为大家带来LiteOS开源版本Ping组件的使用说明,请跟随小编的步伐一起进入探索之旅吧! 本文分享自华为云社区<LiteOS组件尝鲜-玩转Ping>,作者:Lionlace ...

  9. Mac 向日葵设置

  10. Intelij IDEA 隐藏 .idea

    如图 这两文件夹是 IDEA 自动生成的,在开发过程中用不到它.可以把它隐藏(不在 IDEA中显示),操作如下: OK后,立即生效