支持超过4000字节的varchar2类型
source link: https://blog.csdn.net/bisal/article/details/115683157
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
支持超过4000字节的varchar2类型
Oracle中最常用的字符串类型可能就是varchar2了,但是一直以来,让人吐槽最多的,可能就是他的存储容量,12c之前,允许存储4000字节,请注意这的单位是字节,如果你按照非常规的字符定义字段,就得结合字符集,确定他能存储的容量。如果要存储超过这个限制的字符,就得改为CLOB类型了,他的容量是4G,另外一种变通的形式,不想使用大字段,就将要存储的字符拆成多个varchar2类型的字段,读的时候拼接这些字段,起到一样的效果。
从12c开始,varchar2(实际包括nvarchar2和raw)开始支持32767个字节,即32K的容量。他是由max_string_size这个参数控制的,默认值是STANDARD,为了支持32K,需要将其改为EXTENDED,
从官方文档,我们知道,non-CDB、CDB、PDB都支持这个参数,
(1) 如果是non-CDB,步骤较为简单,
1. 关闭数据库,shutdown immediate。
2. 启动数据库到升级模式,startup upgrade。
3. 修改max_string_size=’EXTENDED’,scope=both。
4. 执行@?/rdbms/admin/utl32k.sql
5 .重启数据库至正常open状态,shutdown immdeiate -> startup。
(2) 如果是PDB,步骤和上述相同,只是必须在PDB执行以下操作,
此时的参数值,已经改为EXTENDED,
我们就可以创建一个32767字节的varchar2类型字段,
(3) 如果是CDB,执行以上操作,还需要单独设置pdb$seed以及其他pdb的max_string_size,操作过程:
close->open upgrade->max_string_size->close->open
这就不操作了。
虽然能支持32K的字符串了,但是还存在一些风险和限制,例如,
(1) EXTENDED只支持heap table,不支持cluster table簇表和index-organized tables索引组织表。
(2) max_string_size如果改为EXTENDED,不能再改为STANDARD,这是单向操作,因此要提前设计,
(3) 32K的字符串在Oracle内部还是以LOB的方式存储的,容易造成行链接,对数据读取的性能产生一定的影响。
(4) 索引中的字段,不能直接支持EXTENDED,需要删除索引,更改字段,再重建索引。
(5) 官方文档上提到了如下这些场景,第一个场景,应该和索引长度限制相关,如果按照标准8k的数据块,一个B树索引块所支持的索引长度可能就6千多字节,这就和在MySQL中索引键值长度的问题很像了(《小白学习MySQL - 索引键长度限制的问题》),或者通过substr截取创建索引,或者通过substr创建虚拟列,再创建索引,
Altering MAX_STRING_SIZE will update database objects and possibly invalidate them, as follows:
Tables with virtual columns will be updated with new data type metadata for virtual columns of VARCHAR2(4000), 4000-byte NVARCHAR2, or RAW(2000) type.
Functional indexes will become unusable if a change to their associated virtual columns causes the index key to exceed index key length limits. Attempts to rebuild such indexes will fail with ORA-01450: maximum key length exceeded.
Views will be invalidated if they contain VARCHAR2(4000), 4000-byte NVARCHAR2, or RAW(2000) typed expression columns.
Materialized views will be updated with new metadata VARCHAR2(4000), 4000-byte NVARCHAR2, and RAW(2000) typed expression columns
因此,为了能从语法上支持32K的varchar2,还是需要一些代价的,究竟是设置max_string_size,还是选择CLOB,或者是拆分字段,可能就得结合实际的场景,综合考量。
近期更新的文章:
《积累一些SQL》
《我的股市生涯》
《非Oracle Linux下Oracle 19c CDB数据库安装》
《案例纠正一则》
《VMWare 11安装RedHat Linux 7过程中碰到的坑》
文章分类和索引:
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK