什么是字符集?
- 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 为启动数据泵的会话指定的语言进行编写