必须在dbca的“character sets”页(advanced install模式下可见)选中“use unicode (al32utf8)”,该页位于模板选择后、存储配置前,选中后national character set自动设为al16utf16,建库脚本将包含characterset al32utf8子句,确保数据字典初始即按utf-8解释。

必须在DBCA建库时选中“Use Unicode (AL32UTF8)”,建完再改会触发ORA-12712且不可逆。
DBCA里哪一页设置AL32UTF8才有效
关键页面是“Character Sets”页,不是“Database Identification”或“Storage”页;该页默认被Typical install模式隐藏,必须切换到Advanced install才能看到。选中Use Unicode (AL32UTF8)后,NATIONAL CHARACTER SET会自动设为AL16UTF16,不要手动改。此时生成的建库脚本里会有CHARACTERSET AL32UTF8子句,确保数据字典从初始化就按UTF-8解释。
为什么ALTER DATABASE CHARACTER SET AL32UTF8一定会报ORA-12712
Oracle内核强制校验:新字符集必须是旧字符集的超集,且仅允许在空库上执行。即使原字符集是ZHS16GBK,已有LOB、索引、NVARCHAR2列等结构也会导致校验失败。网上流传的ALTER DATABASE CHARACTER SET INTERNAL_USE AL32UTF8是未公开命令,它跳过校验但不验证数据可映射性,中文可能变成乱码字节,同时使Oracle Support失效,后续升级大概率中断。
建库后如何验证AL32UTF8已生效
启动数据库后立即检查三处:
-
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET'—— 必须返回AL32UTF8 -
SELECT DUMP('你好', 1016) FROM DUAL—— 正确结果是TYP=1 LEN=6: 60,0,4f,60,0,4f(UTF-8十六进制) - 确认
%ORACLE_HOME%\network\admin\listener.ora和tnsnames.ora中没硬编码WE8MSWIN1252之类旧值,否则客户端连上来仍可能走错路径
多租户环境下PDB的字符集继承规则
CDB根容器字符集必须是AL32UTF8,新建的PDB(如用PDB$SEED创建)才会自动继承它。如果CDB根不是AL32UTF8,所有PDB都强制使用根的字符集,无法单独设为AL32UTF8。想让不同字符集的PDB共存,只能建多个CDB,不能靠单个CDB内部切换。
最容易被忽略的是:Windows上安装时若跳过Advanced install,DBCA会静默采用系统locale(如WE8MSWIN1252),而这个选择没有回退按钮——建库完成那一刻,字符集就锁死了。











