博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

DBA 第十六章:使用全球化支持

Posted on 2011-09-25 17:00  little健健  阅读(296)  评论(0编辑  收藏  举报

什么是字符集?

  • Oracle DB支持的字符编码方案
    • 单字节字符集:每个字符占用一个字节
      • 7 位
      • 8 位
    • 多字节字符集,包括 Unicode
      • AL32UTF8 编码
      • AL16UTF16 编码
      • 增补字符

如何使用字符集

  • Oracle Net 将客户机上的 NLS_LANG 设置与服务器上的字符集进行比较。NLS_LANG 参数定义客户机终端的字符编码方案
  • 如果需要,会进行自动透明的转换。

要避免的问题

  • 如果客户机上的 NLS_LANG 参数未正确设置,则通常会在数据库中输入无效数据。
  • 示例
    • 假定数据库字符集是 AL32UTF8,客户机为英文版的 Windows 操作系统(码页为WE8MSWIN1252),客户机上的 NLS_LANG 设置为 AL32UTF8。输入数据库的数据是用WE8MSWIN1252 编码,却没有转换为 AL32UTF8 数据,因为客户机上的 NLS_LANG设置与数据库字符集相符。
    • 数据库字符集是 US7ASCII,客户机终端使用的是简体中文版 Windows。通过将NLS_LANG 设置为 SIMPLIFIED CHINESE_HONGKONG.US7ASCII,作为客户机字符集,可以在单字节数据库中存储多字节简体中文字符。这就表示,数据库会将这些字符视为单字节的 US7ASCII字符,因此,所有 SQL 字符串操纵函数(如 SUBSTR或 LENGTH)都基于字节,而不是字符。将数据从该数据库导出并导入其它数据库之后,可能会丢失所有非 ASCII 字符

选择字符集

  • 综合考虑
  • 选择满足当前和未来业务需求的正确字符集
  • 指定字符集
  • 在创建数据库之后更改字符集
  • 数据库字符集和国家字符集

获取字符集信息:NLS_DATABASE_PARAMETERS 视图显示数据库的永久性 NLS 设置

指定基于语言的行为

  • 指定国家语言支持(NLS) 参数的方法
    • 作为服务器端的初始化参数,指定默认的服务器环境。
    • 作为客户机的环境变量,指定区域设置相关行为,覆盖为服务器设置的默认值
    • 使用 ALTER SESSION 命令覆盖为客户机和服务器设置的默认值
    • SQL 函数
  • 为会话指定基于语言的行为
    • NLS_LANG=<language>_<territory>.<charset>
      • NLS_LANG=FRENCH_CANADA.WE8ISO8859P1
    • 设置其它 NLS 环境变量
      • 覆盖所有会话的数据库初始化参数设置
      • 定制区域设置行为
      • 更改 NLS 库文件的默认位置
  • 基于语言和基于地区的参数
  • ALTER SESSION SET 
    NLS_DATE_FORMAT='DD.MM.YYYY';

    DBMS_SESSION.SET_NLS('NLS_DATE_FORMAT',
    '''DD.MM.YYYY''') ;


    SELECT TO_CHAR(hire_date,'DD.Mon.YYYY',
    'NLS_DATE_LANGUAGE=FRENCH')
    FROM employees
    WHERE hire_date > '01-JAN-2000';


语言搜索和排序

  • 排序顺序会受以下因素影响
    • 区分大小写
    • 变音符号或重音字符
    • 被视为单个字符的字符组合
    • 音标或字符外观
    • 文化首选项
  • 类型
    • 二进制排序
    • 单语语言排序
    • 多语语言排序
  • 相关参数
    • NLS_SORT 参数
      • 从 NLS_LANG 环境变量得到的默认值(如果设置的话)
      • 可以为会话、客户机或服务器指定
    • NLSSORT 函数
      • 在查询级别定义排序方法
  • 不区分大小写和重音的搜索和排序
    • NLS_SORT = <NLS_sort_name>[_AI | _CI]   指定语言名称
    • NLS_COMP = BINARY | ANSI | LINGUISTIC    为 WHERE 子句和 PL/SQL 块指定排序操作
  • SQL 和函数支持的设置
    • WHERE
    • ORDER BY
    • START WITH
    • HAVING 
    • IN/NOT IN 
    • BETWEEN 
    • CASE-WHEN
  • 语言索引支持
    • 对语言排序值创建索引。
    • 无需指定 ORDER BY 子句和 NLSSORT 即可快速查询数据
      • CREATE INDEX list_word ON
        list (NLSSORT(word, 'NLS_SORT=French_M'));

        SELECT word FROM list;
    • 对 NLS_SORT 参数进行设置,使其与创建索引时要用于语言排序的语言定义相符。

数据转换

  • 使用 Oracle 实用程序
    • 如果使用不同的字符集,将数据从一个数据库中导出并导入另外一个数据库时,可能会执行多项数据转换。
    • 外部表使用服务器上的 NLS 设置确定数据字符集。
    • SQL*Loader:
      • 常规路径:将数据转换成 NLS_LANG 指定的会话字符集。
      • 直接路径:使用客户端指令转换数据。
  • 使用数据泵
    • 始终以数据所来自的数据库的字符集保存数据
    • 数据泵导入实用程序会将数据转换成目标数据库的字符集
    • 数据泵日志文件以 NLS_LANG 为启动数据泵的会话指定的语言进行编写