Oracle 12C 新特性之扩展数据类型(extended data type)

本文介绍了Oracle12C中的新特性——扩展数据类型,如VARCHAR2和RAW的大小提升至32K字节,详细描述了如何设置并验证MAX_STRING_SIZE参数,以及扩展对LOB存储的影响。

Oracle 12C 新特性-扩展数据类型,在12c中,与早期版本相比,诸如VARCHAR2, NAVARCHAR2以及 RAW这些数据类型的大小会从4K以及2K字节扩展至32K字节。只要可能,扩展字符的大小会降低对LOB数据类型的使用。为了启用扩展字符大小,你必须将MAX_STRING_SIZE的初始数据库参数设置为EXTENDED。

实验流程:
1.查看参数max_string_size默认值
SQL> show parameter max_string_size
NAME     TYPE VALUE
------------------------------------ ----------- ------------------------------
max_string_size     stringSTANDARD
说明:12C 参数max_string_size默认值是standard,即不改变varchar2、nvarchar2、和raw数据类型的大小限制,和11g保持一致。
2. 关闭数据库
SQL> shutdown immediate;
3. 以升级模式重启数据库
SQL> startup upgrade;
3. 更改参数: ALTERSYSTEM SET MAX_STRING_SIZE=EXTENDED;
SQL> alter system  set max_string_size=extended scope=spfile;
System altered.
4. 执行 utl32k.sql as sysdba:

SQL> @$ORACLE_HOME/rdbms/admin/utl32k.sql

说明:如果环境是cdb+pdb,那么所有的cdb + pdb$seed + pdb 都需要在 startup upgrade; 状态下跑脚本 @$ORACLE_HOME/rdbms/admin/utl32k.sql 。不然,只扩展完cdb后,pdb不能打开,报ORA-14694: database must in UPGRADE mode to begin MAX_STRING_SIZE migration 。

5. 检查一下有没有产生失效对象
SQL> select count(*) from dba_objects where status<>'VALID';
  COUNT(*)
----------
0
6. 关闭数据库
SQL> shutdown immediate;
7. 以读写模式重启数据库
SQL> startup;
8.检查参数max_string_size , 与失效对象。
SQL> show parameter max_string_size
NAME     TYPE VALUE
------------------------------------ ----------- ------------------------------
max_string_size     stringEXTENDED
SQL> select count(*) from dba_objects where status<>'VALID';
  COUNT(*)
----------
0
9. 测试
SQL> create table t_32k (name varchar2(32000)); 
Table created.
SQL> insert into t_32k values('andy'); 
1 row created.
SQL> select * from t_32k;
NAME
--------------------------------------------------------------------------------
andy

对比LOB数据类型,在ASSM表空间管理中,扩展数据类型的字段以SecureFiles LOB加以存储,而在非ASSM表空间管理中,它们则是以BasciFiles LOB进行存储的。

注意:一旦更改,你就不能再将设置改回STANDARD。

转自Oracle 12C 新特性之扩展数据类型(extended data type) - 张冲andy - 博客园 (cnblogs.com)

Oracle 数据库中,`TEXT` 类型并不是一个原生支持的数据类型,通常我们使用 `CLOB`(Character Large Object)来存储大文本数据。如果你需要将 `CLOB` 类型的字段转换为 `VARCHAR2` 类型进行显示,可以使用 Oracle 提供的函数进行转换。 --- ### ✅ 方法一:使用 `SUBSTR()` 函数截取部分显示 如果 `CLOB` 数据量不大,可以使用 `SUBSTR()` 函数将其截取为 `VARCHAR2` 类型: ```sql SELECT SUBSTR(clob_column, 1, 4000) AS varchar_data FROM your_table; ``` > 注意:`VARCHAR2` 的最大长度为 4000 字节(字符),因此不能超过这个限制。 --- ### ✅ 方法二:使用 `TO_CHAR()` 转换(适用于小文本) 如果字段是 `NCLOB` 或者 `CLOB`,可以尝试使用 `TO_CHAR()`: ```sql SELECT TO_CHAR(clob_column) AS varchar_data FROM your_table; ``` > ⚠️ 注意:`TO_CHAR` 对 `CLOB` 的支持有限,仅适用于内容小于 4000 字节的情况。 --- ### ✅ 方法三:PL/SQL 中使用 `DBMS_LOB.SUBSTR` 函数(推荐) 在 PL/SQL 中处理 `CLOB` 更加灵活,推荐使用 `DBMS_LOB.SUBSTR`: ```sql SELECT DBMS_LOB.SUBSTR(clob_column, 4000, 1) AS varchar_data FROM your_table; ``` - 参数说明: - 第一个参数:要读取的字节数(最多 4000) - 第二个参数:起始位置(通常为 1) --- ### ✅ 示例:将 CLOB 转换为 VARCHAR2 显示 ```sql CREATE TABLE test_table ( id NUMBER PRIMARY KEY, content CLOB ); INSERT INTO test_table VALUES (1, '这是一个测试文本'); -- 查询时转换 SELECT id, DBMS_LOB.SUBSTR(content, 4000, 1) AS content_varchar FROM test_table; ``` --- ### ⚠️ 注意事项: - `VARCHAR2` 最大长度为 4000 字符(Oracle 12c 及以上支持 32767 字节的扩展 `VARCHAR2`,但需设置 `MAX_STRING_SIZE=EXTENDED`)。 - 如果文本内容超过限制,建议只显示部分内容或进行分页读取。 --- ### 🔒 如果你使用的是其他“文本类型”: - `LONG` 类型:建议迁移到 `CLOB` - `NCLOB`:使用 `TO_CHAR()` 或 `DBMS_LOB.SUBSTR()` 处理 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值