Oracle中最常用的字符串类型可能就是varchar2了,但是一直以来,让人吐槽最多的,可能就是他的存储容量,12c之前,允许存储4000字节,请注意这的单位是字节,如果你按照非常规的字符定义字段,就得结合字符集,确定他能存储的容量。如果要存储超过这个限制的字符,就得改为CLOB类型了,他的容量是4G,另外一种变通的形式,不想使用大字段,就将要存储的字符拆成多个varchar2类型的字段,读的时候拼接这些字段,起到一样的效果。
从12c开始,varchar2(实际包括nvarchar2和raw)开始支持32767个字节,即32K的容量。他是由max_string_size这个参数控制的,默认值是STANDARD,为了支持32K,需要将其改为EXTENDED,
SQL>?show?parameter?max_string_size
NAME TYPE VALUE
---------------- ------ ----------
max_string_size??string?STANDARD
从官方文档,我们知道,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执行以下操作,
SQL>?alter?pluggable?database?bisalpdb2?close;
Pluggable database altered.
SQL>?alter?pluggable?database?bisalpdb2?open?upgrade;
Pluggable database altered.
SQL>?alter?system?set?max_string_size=extended?scope=both;
System altered.
SQL>?@?/rdbms/admin/utl32k.sql
Session?altered.
//脚本执行速度,应该和当前数据库中的对象数量有关。
SQL> alter?pluggable?database?bisalpdb2?close;
Pluggable database altered.
SQL> alter?pluggable?database?bisalpdb2?open;
Pluggable database altered.
此时的参数值,已经改为EXTENDED,
SQL>?show?parameter?max_string_size
NAME?????????????TYPE???VALUE
---------------- ------ --------
max_string_size??string?EXTENDED
我们就可以创建一个32767字节的varchar2类型字段,
SQL>?create?table?test(c?varchar2(32767));
Table created.
(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,这是单向操作,因此要提前设计,
SQL>?alter?pluggable?database?bisalpdb2?close;
Pluggable database altered.
SQL>?alter?pluggable?database?bisalpdb2?open?upgrade;
Pluggable database altered.
SQL> alter system set max_string_size=standard scope=both;
alter system set max_string_size=standard scope=both
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-14693: The MAX_STRING_SIZE parameter must be EXTENDED.
(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过程中碰到的坑》
文章分类和索引:
一、简介 本设计为硬币图像识别统计装置通过数码相机获取平铺无重叠堆积的硬币的...
首先给扑克牌中每张牌设定一个编号,下面算法实现的编号规则如下: u 红桃按照从...
git工作区,暂存区,版本库之间的关系: 我们建立的项目文件夹就是工作区,在初...
从功能测试、性能测试、界面测试、安全性测试、易用性、兼容性测试、震动测试七...
本文实例讲述了jsp中page指令用法。分享给大家供大家参考。具体如下: 一、JSP ...
今日国内领先的智能数据服务运营商觉非科技完成近亿元A轮融资。本轮融资由和高资...
一、MVC MVC模式的意思是,软件可以分成三个部分。 视图(View):用户界面。 控...
前言 关于Window,你了解多少呢?看看下面这些问题你都能答上来吗。 如果你遇到这...
我们知道微软将会在今年给Windows10更换全新设计的UI,让Windows10的界面更加整...
大家好,今天我们来简单的聊一聊缓存问题。什么是缓存呢?它在系统设计中是在一个...