Oracle 的推荐字符集
- 作为数据库字符集来选择Unicode
- 推荐在所有的新建系统配置中使用Unicode
- 现有系统最终也需要移动到Unicode中
- 通过Unicode构筑系统的优点
- 主要在于便利性、兼容性以及扩展性方面
- 可以在大部分的开发环境以及标准规格中(XML以及Web服务等)使用
- 因为Unicode consortium定义的,所以有兼容性
- 便于追加JIS X 0213:2004 等字符
- 不需要支持多语言数据时,或者不需要Unicode时
- 长期来说,可能会在新建系统中选择最优选项,结果上来说可以节省成本,获得竞争上的优越性
- 主要在于便利性、兼容性以及扩展性方面
今后的动向
- Microsoft 公司的OS、 Windows Vista 已经符合JIS规则「JIS X 0213:2004」(JIS2004)了
- 对应Oracle Database
- 支持将JIS X 0213 的字符 作为Unicode储存
- JIS X 0213 的 Unicode 映射,对应Unicode 的版本3.2
- 这次 Unicode 的版本需要在Oracle Database 10g Release1 (10.1.0)以后才能应用。
- 为了在数据库中储存JIS X 0213 的字符集
- Oracle Database 10.1.0 以后需要使用数据库字符集 AL32UTF8 (VARCHAR2、CHAR、LONG、CLOB) 以及国家字符集 AL16UTF16 (NVARCHAR2、NCHAR、NCLOB)
- 上述之外的字符集不能使用JIS X 0213
字符代码的迁移注意点
- 将字符集 JA16EUC的数据库迁移到字符集 AL32UTF8 的数据库中
- Exp/Imp的迁移中,可能发生ORA-1401
- EUC以及UTF8中,为了储存一个字节的字符数不同,可能导致以下情况发生
- EUC如果是ASCII字符就是1字节,如果是日语的话就是2字节
- UTF8如果是ASCII文字符就是1字节,如果是日语的话就是2字节
- EUC以及UTF8中,为了储存一个字节的字符数不同,可能导致以下情况发生
- Exp/Imp的迁移中,可能发生ORA-1401
- 处理方法
- 在JA16EUC的数据库中,将使用CHAR的column更改为VARCHAR2
- 更改column尺寸
重建表
- 调查现有数据库
- 字符数据变换测试
- 使用Database Character Set Scanner读取字符数据库,测试以下条件
- 变更新建字符集时,Data cell的字符代码point是否会发生变化
- Data cell是否可以正常变换
- 变更后的数据是否符合现有的列尺寸
- 对象:CHAR、VARCHAR2、LONG、CLOB、NCHAR、NVARCHAR2、NCLOB以及VARRAY(10g)列
- LONG、CLOB以及NCLOB列 尺寸不适合此种情况
- 使用Database Character Set Scanner读取字符数据库,测试以下条件
- 字符数据变换测试
- 使用字符长(character)语义
- 不使用默认的字节长度,而是通过在字符长度中指定column长度来制成表
- 经过DB link时,通过Create table as select 制成表之后,将数据输出
- JA16EUC 转 AL32UTF8 时,column尺寸会增大3倍
Database Character Set Scanner的安装与启动
- 安装Database Character Set Scanner的系统表
- 通过SYS用户连接,执行以下脚本
- $ORACLE_HOME/rdbms/admin/csminst.sql
- 启动Database Character Set Scanner
- 使用对话型会话的方法
- % CSSCAN username/password (拥有DBA权限的用户)
- 对话型会话中,需要输入接下来的参数值。
- 扫描模式:FULL/TABLE/USER
- 变更地址字符集:TOCHAR
- ARRAY: 排列fetch buffer的尺寸
- PROCESS:同时扫描进程数
- % CSSCAN username/password (拥有DBA权限的用户)
- 使用对话型会话的方法
Database Character Set Scanner输出(summary)
- 应用数据的变更summary(整体、全表、全列)
- R9.0.1
- Changeless
- 新建字符集中,数据cell数也不会产生变化。
- Convertible
- 新建字符集中正常变更的数据cell数。
- Exceptional
- 无法变更 的数据cell数。变更时,会失去一部分字符,并且会舍弃数据。
- Changeless
- R10.2.0
- Changeless
- 数据在新建字符集中也不会产生变化。
- Convertible
- 数据cell可以在新建字符集中正常变换。
- Truncation
- 变换时会舍弃数据。
- Lossy
- 变换是会失去字符数据。
- Changeless
- R9.0.1
Database Character Set Scanner输出(个别例外的报告)
- 会报告以下存在例外的数据会以下
- 超过列尺寸(exceed column size)
- 超过最大列间隔时,需要扩展列尺寸
- 如果没有超过扩展列尺寸的话,就会舍弃数据
- 不可逆的变换 (lossy conversion)
- 新建字符集迁移之前,需要修正数据
- 如果不修正数据的话,无效字符就会变成置换字符
- 超过列尺寸(exceed column size)
- 报告例外数据的最大列尺寸(Max Post Conversion Data Size)
使用字符长语义
- 通过指定列长来定义字符长度
- 使用NLS_LENGTH_SEMANTICS 参数
- Alter session set NLS_LENGTH_SEMANTICS=CHAR;
- Create table XXX ( A varchar2(10));
- A列中可以储存10个字符(1byte字符,2byte字符没有区别)
- 通过UTF8制成表时,可以重新使用现有的DDL语句。
- 无法储存超过4000byte的数据
- A列中可以储存10个字符(1byte字符,2byte字符没有区别)
- 使用NLS_LENGTH_SEMANTICS 参数
※ create table XXX ( A varchar2(10 CHAR)); 中也一样的
PL/SQL程序中需要注意的问题
- 变量的数据长度
- %TYPE 中,需要配合数据库的column尺寸
- 手动变更
- 字符列函数
- SUBSTR,LENGTH,INSTR
OO4O 中确认
- 通过CreateDynaset获得field属性
- 获得列长时需要注意
- OraMaxSize :定义列的最大尺寸
- OraMaxDSize :列的最大表示尺寸
- 通过10g (OO4O 9.2.0.4.9 以后)变更
从EUC数据库开始迁移
- 数据库的字符集包含于JA16EUC 的数据库时的迁移方法
- Oracle7 环境的 EXPORT utility 中,在JA16SJIS 中设置NLS_LANG (最好是迁移地址的字符集)抽出数据
- 在新环境中,从EXPORT转储数据开始输入数据
- JA16SJIS/UTF8/AL32UTF8等,供应商定义文字所定义的字符集的数据库
注意事项
- CSSCAN会在11.2以后的数据库(12c)中会通知用户不在支持的项目。
- CSSCAN and CSALTER To Be Desupported after DB 11.2. [ID 1418321.1]
- 作为后续功能还有Database Migration Assistant for Unicode (DMU)
- The Database Migration Assistant for Unicode (DMU) Tool [ID 1272374.1]
- DMU还可以处理10.2.0.4以后的数据库
- The Database Migration Assistant for Unicode (DMU) Tool [ID 1272374.1]
Leave a Reply