首页 > 数据库 >Oracle 不同字符集复合索引长度验证

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

时间:2024-01-28 21:06:51浏览次数:27  
标签:create 字符集 char 索引 varchar2 zhaobsh name1 Oracle byte

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) ;



标签:create,字符集,char,索引,varchar2,zhaobsh,name1,Oracle,byte
From: https://blog.51cto.com/u_11529070/9454175

相关文章

  • firefox 怎么自定义搜索引擎
     后面使用的时候,发现Firefox不能自定义搜索引擎了。从baidu、知乎上面搜索的结果,大部分都是打非所问的,不知道偏到哪里了。从stack上面找到的答案,记录一下 1、地址栏打开about:config2、搜索browser.urlbar.update2.engineAliasRefresh3、点击右侧的+4、现在,当您转到“......
  • SQLServer和Oracle常用函数对比
      1.绝对值 S:select abs(-1) value O:select abs(-1) value from dual 2.取整(大) S:select ceiling(-1.001) value O:select ceil(-1.001) value from dual 3.取整(小) S:select floor(-1.001) value O:select flo......
  • Oracle RAC SCAN ip的原理、配置及优缺点
    在oracle11g中,SCANIP还用的很少。到oracle12.2或者19c,用户已经基本上清一色的切换到了SCANIP。所以很有必要理解oracle的SCANIP运行机制和配置。先回顾下VIP。RAC的每个节点都需要有一个虚拟IP,这就是VIP。VIP需要和PUBLICIP同一个子网,它们是由GI的Clusterware来管理......
  • oracle启动服务命令
    启动Oracle服务的方法有多种,以下是其中几种常见的方法:1、使用命令行启动服务: 在Windows系统中,打开命令提示符窗口,输入以下命令: shell复制代码 netstartOracleService<ORCL实例名称>在Linux系统中,启动服务的命令有所不同,具体可以参考Oracle的......
  • Oracle 数据库常用操作语句
    一、Oracle数据库操作1、创建数据库   createdatabase databasename2、删除数据库    dropdatabase dbname3、备份数据库完全备份    exp demo/demo@orcl buffer=1024 file=d:\back.dmp full=y   demo:用户名、密码   buffer: 缓存大......
  • 文章索引
    游记类2023年2023NOIP2023CSP复赛2023CSP初赛复盘题解类ABC比赛系列复盘USACO2023-2024赛季复盘2024年题目选讲CSP模拟赛复盘CSP初赛训练复盘2023.7暑假集训测试复盘2023暑假集训复盘2023题解合集2023年终总结洛谷月赛翻盘记CF比赛复盘知识点类网络流网......
  • 将关键词优化到搜索引擎首页的方法?
    将关键词优化到搜索引擎首页的方法?下面跟北京wordpress建站公司小编一起来了解详细内容:新手在做网站SEO优化时,如何提高网站首页的关键词排名?其实这也很简单,就是优化用户喜欢的内容到搜索引擎首页,这样网站才能有更好的排名,并吸引更多准确的用户流量。在资金充足的情况下......
  • # 生成指定列名行索引的空表格 # 修改字典内不同表格的值
    #生成指定列名行索引的空表格#修改字典内不同表格的值importpandasaspdlist1=['列1','列2','列3']#列名列表list2=['行1','行2','行3']#行索引列表df=pd.DataFrame(columns=list1,index=list2)#1dic={key:dffork......
  • 技术解读 | KunDB助力头部金融机构关键系统的Oracle国产替代
     星环科技自主研发的分布式交易型数据库KunDB助力头部金融机构实现了关键系统的Oracle国产化替代。通过可视化迁移工具完成了对象与数据的平滑迁移,将原先两套Oracle系统(一套Oracle单机系统,一套OracleRAC系统)统一迁移到一套KunDB集群。并且基于常规国产服务器使得每日增量数据......
  • [转帖]Oracle replay工具用法
    一、简介Oracle11g推出的神器,可以抓取生产环境真实负载(sql语句),在目标环境重演,进行对比。在核心生产环境迁移等重大变更前,尽量确定变更带来的影响。核心步骤包括:准备工作、捕获负载、预处理负载、重演负载、对比分析,每步又包含多个子步骤,下面通过测试案例来看。二、准备......