Oracle数据库的字符集

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字节
  • 处理方法
    • 在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列 尺寸不适合此种情况
  • 使用字符长(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:同时扫描进程数

 

 

Database Character Set Scanner输出summary

 

  • 应用数据的变更summary(整体、全表、全列)
    • R9.0.1
      • Changeless
        • 新建字符集中,数据cell数也不会产生变化。
      • Convertible
        • 新建字符集中正常变更的数据cell数。
      • Exceptional
        • 无法变更 的数据cell数。变更时,会失去一部分字符,并且会舍弃数据。
    • R10.2.0
      • Changeless
        • 数据在新建字符集中也不会产生变化。
      • Convertible
        • 数据cell可以在新建字符集中正常变换。
      • Truncation
        • 变换时会舍弃数据。
      • Lossy
        • 变换是会失去字符数据。

 

Database Character Set Scanner输出个别例外的报告

 

  • 会报告以下存在例外的数据会以下
    • 超过列尺寸(exceed column size)
      • 超过最大列间隔时,需要扩展列尺寸
      • 如果没有超过扩展列尺寸的话,就会舍弃数据
    • 不可逆的变换 (lossy conversion)
      • 新建字符集迁移之前,需要修正数据
      • 如果不修正数据的话,无效字符就会变成置换字符
  • 报告例外数据的最大列尺寸(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的数据

※ 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以后的数据库

 

Comment

*

沪ICP备14014813号

沪公网安备 31010802001379号