千家信息网

Oracle 12C 修改字符集为AL32UTF8研究

发表于:2024-11-24 作者:千家信息网编辑
千家信息网最后更新 2024年11月24日,有这样一个问题:PDB字符集能否从ZHS16GBK修改为AL32UTF8?答案:由于CDB为ZHS16GBK,导致PDB不能修改。针对这个问题作了一下学习,记录一下。1、迁移转换字符集方法:12C :
千家信息网最后更新 2024年11月24日Oracle 12C 修改字符集为AL32UTF8研究

有这样一个问题:PDB字符集能否从ZHS16GBK修改为AL32UTF8?

答案:由于CDB为ZHS16GBK,导致PDB不能修改。

针对这个问题作了一下学习,记录一下。

1、迁移转换字符集方法:

12C :只有DMU这个工具

10g/11g :csscan/ csalter /部分 exp/imp

8i/9i :Alter Database Character Set () / 部分 exp/imp

2、AL32UTF8 是一个变宽度的字符集,表示为 1 个字符的代码可以是 1,2,3 或 4 个字节长。

这 与 WE8ISO8859P1 或 WE8MSWIN1252 字符集中 1 字符始终是 1 个字节有很大的区别。

3、使用 AL32UTF8数据库会增长,最大的扩展将会发生在 CLOB 类型上(或者 XMLtype - 该类型后台使用 CLOB),

如果源数据 库是 8 bit 字符集(WE8ISO8859P1,WE8MSWIN1252 等),那么转换后的 Clob 列会在磁盘 大小上变成原来的两倍。

4、CDB不能转换字符集,只能重新创建CDB。DMU 是PDB转换字符集的唯一工具;

5、截至2019.9.8,DMU最新版本为19.1,使用过程图形界面有卡死现象。DMU用于转换数据的过程是:

将数据库置于受限模式。

禁用各种作业队列进程。

删除或禁用所选索引。

禁用选定的触发器和约束。

将用户表和选定数据字典表中的数据转换为Unicode。

转换CLOB数据字典中的列。

发表ALTER DATABASE CHARACTER SET声明。

启用触发器和约束; 并重新创建索引和约束。

恢复数据库实例参数。

6、使用9i 传统方法alter database character set INTERNAL_USE AL32UTF8; 修改CDB测试成功,但oracle官方不推荐。该方法并未执行两个步骤:将用户表和选定数据字典表中的数据转换为Unicode 和 转换CLOB数据字典中的列。这两关键步骤只能通过DMU实行。

测试:使用该方法切换CDB字符集从ZHS16GBK到AL32UTF8成功,同时PDB$SEED也自动变化;但按官方说法切换不完整,不赞成这样做。

7、NLS_NCHAR_CHARACTERSET("国家字符集")定义了 NCHAR,NVARCHAR2 和 NCLOB 列 的编码并且在 9i 及以上版本已经是 Unicode了(参见 Note 276914.1 The National Character Set in Oracle 9i 10g and 11g)。

8、NLS_CHARACTERSET("字符集")定义了"普通的" CHAR,VARCHAR2,LONG 和 CLOB列编 码,这些也可以被用于存放 Unicode。在这样的情况下需要 AL32UTF8 或者 UTF8 NLS_CHARACTERSET 数据库。

参考文档:

AL32UTF8/UTF8(Unicode)数据库字符集含义 (文档 ID 1946289.1)

如何选择或更改数据库字符集 (NLS_CHARACTERSET) (文档 ID 1525394.1)

The Database Migration Assistant for Unicode (DMU) Tool (文档 ID 1272374.1)

0