有这样一个问题: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)