浅析Oracle数据库字符集问题

时间:2022-07-16 04:59:46

浅析Oracle数据库字符集问题

摘要:数据库核心字符集决定了数据在数据库中的存储格式。本文讨论了Oracle数据库核心字符集的设置方法及相关参数,并提出了核心字符集的修改方法。

关键词:Oracle;字符集

中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)17-31198-02

Discussion on Oracle National Language Support

TENG Yong-chang

(Oracle Union University,Beijing 100096,China)

Abstract:Oracle Database national language support decide store format of data. This paper discuss how to configuration database characterset, and give a update database nls parameters method.

Key words: Oracle;National Language Support

1 什么是字符集

Oracle是目前最为流行的关系型数据库管理系统,因其在数据安全性与数据完整性控制方面的优越性能,以及跨越操作系统、多硬件平台的数据相互操作等特点,越来越多的用户使用Oracle作为其信息系统管理、企业数据处理、Internet、电子商务网站等领域应用数据的后台处理系统。在使用Oracle数据库时,如果核心字符集设置不正确,则数据显示会出现乱码。那么,到底什么是字符集,我们先看下面的一个例子。

在上述显示结果中,数据库中的数据存储有中文,但是查询基表product时,该显示中文的地方出现了“?”号,而英文显示是正确的,这是数据库的核心数据显示出现错误(注:后边可以修改这种错误)。这个问题也是我们在实际中容易出现的问题,特别容易出现在数据库的卸出(Export)与导入(Import)时。那么,这是什么原因呢?

这个问题就是由数据库的字符集问题引起。简单地讲,字符集就是决定数据库所支持的语言标准,也就是说,数据库是支持中文、还是日文、英文等,不决定操作系统平台,而决定于字符集

2 Oracle核心字符集设置

在Oracle数据库中,数据库核心支持什么样的语言,也就是说,数据库本身可以存储、处理哪一种语种,是与操作系统没有关系的,而是与数据库核心字符集的设置是否正确有直接关系的。例如,可以在英文的操作系统中存储中文、在中文操作系统存储日文等。在Oracle中,可以通过设置与字符集有关的参数,改变数据显示格式。下边说明其中一些常用参数的设置方法。

参数NLS_CALENDAR决定日历系统格式,缺省为 Gregorian。 日期显示格式可以使用修改会话命令进行修改,例如将日历显示格式为Japanese Imperial日本语言格式:

SQL> alter session set nls_calendar='Japanese Imperial';

修改完成后,所有日历的显示格式是相同的,都是日本语言格式:

SQL> select empno,hiredate,deptno,ename from emp

数据字典nls_database_parameter设置了与存储、处理、检索中文字符有关的参数,该参数为NLS_CHARACTERSET。如果要在数据库中存储中文,则此参数的取值必须为ZHS16CGB231280、或ZHS16GBK中的某一个,否则,数据库中的中文将出现乱码。字符集ZHS16CGB231280从Oracle7.3版开始启用,而字符集ZHS16GBK从Oracle8版开始启用。中文字符集与数据库版本的关系如下表:

Oracle数据库核心字符集对照表

A、Oracle客户端字符集设置

在Oracle中,每个客户端可以有不同的字符集设置。决定客户端字符集类型的是由参数NLS_LANG。其格式如下:

NLS_LANG = language_territory.charset

其中,

Language:表示本国日期中的月、日的描述及书写方向

Territories:表日历习惯,日期、时间格式,数字

Character Sets:数据库核心字符集类型

如:

NLS_LANG = SIMPLIFIED CHINESE_CHINA.ZHS16CGB231280或

NLS_LANG = SIMPLIFIED CHINESE_CHINA.ZHS16GBK或

NLS_LANG = AMERICAN_AMERICA.US7ASCII 或

NLS_LANG = JAPANESE_JAPAN.JA16EUC

在Unix中,通过设置环境变量NLS_LANG,可以直接在操作系统中定义字符集类型,方法如下:

$ NLS_LANG = “simplified chinese”_china.zhs16gbk

$export NLS_LANG

在Windows 中,决定客户端字符集的参数NLS_LANG被定义在Windows系统的注册表里。如果要重新定义,可以直接修改注册表。如果要将界面修改为英文,NLS_LANG的取值为:

American_America.US7ASCII

B、字符集转换实例

在Oracle中,一些不同的字符集是允许进行转换的,同时存在多语种字符集的问题,允许在同一数据库中使用不同字符集的语种。下面分别说明几种使用不同字符集数据库的案例。

案例一、单一字符集数据库系统:

这种应用系统的结构如图1所示,服务器与客户端的字符集相同,这种字符集的使用是典型的数据库应用类型。当然,这里也允许使用NLS16CGB231280字符集,这两种字符集维持兼容。

图1 单一字符集数据库

需要说明的是,数据库核心字符集与服务器操作系统的语种是没有关系的,也就是说,在英文的操作系统中可以存储中文,在中文操作系统的数据库中也可以存储日文,只要将字符集参数设置正确就可以了。

案例二、单一字符集三层数据库系统结构:

图2是基于Oracle数据库的三数据库应用层结构。在数据库服务器、以及应用服务器中使用了相同的字符集ZHS16GBK,这是最为理想的状况,服务器之间不存在字符集转换问题。

图2 单一字符集三层结构

案例三、不同字符集不可以相互转换:

对于图3的情况,字符集是不能相互转换的,ZHS16GBK与US7ASCII是截然不同的两种字符集。在字符集ZHS16GBK的数据库中,可以查询到英文,但在US7ASCII字符集的数据库中的中文会出现乱码。

Oracle8i、Oracle9i支持Unicode 3.0标准,支持Unicode编码的数据库字符集类型有UTF8 、AL32UTF8、以及 UTFE,优先使用UTF8。这样,在同一台服务器中可以存储不同类型语种的语言,读取不同的语言使用不同字符集的客户端即可,这种应用系统特别适用于国际多语种的环境。

图3 不同字符集不可相互转换

3 修改数据库核心字符集

在实际中,如果数据库核心字符集在安装时选择错误,则必须修改,否则将来汉字的显示会出现乱码。要改变数据库核心字符集,一种方法是重新安装数据库,另外一种方法则是修改字符集。重新安装数据库自然可以,这里不必赘述,下面说明如何修改核心字符集。

在Oracle8i、Oracle9i中,可以通过修改系统数据字典props$直接修改数据库核心字符集,将参数NLS_CHARACTERSET的列值改为所需要的字符集类型,修改后重新启动数据库即可。例如:

SQL> update props$

2> set value$='ZHS16GBK'

3> where name='NLS_CHARACTERSET';

在Oracle数据库中,客户端字符集必须与数据库核心字符集类型一致,否则汉字将出现乱码;如果要将早期数据库中的数据移入到Oracle8i、Oracle9i中,由于原始数据字符集问题,新的数据库核心必须使用早期数据库核心字符集类型,客户端也要保持与早期核心字符集一致。这种使用方式不存在字符集转换问题。

参考文献:

[1]滕永昌.Oracle数据库系统管理(上、下册)[M].北京:清华大学出版社,2003.

[2]Kevin Loney.Oracle9i DBA手册[M].北京:机械工业出版社,2003.

注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。

上一篇:图像多描述编码的MDSQ算法及其Matlab实现 下一篇:基于Agent的农产品安全知识转移模型研究