`

Oracle 字符集的查看和修改

阅读更多

一、什么是 Oracle 字符集

Oracle 字符集是一个字节数据的解释的符号集合 , 有大小之分 , 有相互的包容关系。 ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。它使 数据库 工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。

影响 Oracle 数据库字符集最重要的参数是 NLS_LANG 参数。

它的格式 如下 : NLS_LANG = language_territory.charset

它有三个组成部分 ( 语言、地域和字符集 ) ,每个成分控制了 NLS 子集的特性。

其中 :

Language 指定服务器消息的语言, 影响提示信息是中文还是英文

Territory 指定服务器的日期和数字格式,

Charset 指定字符集。

:AMERICAN _ AMERICA. ZHS16GBK

NLS_LANG 的组成我们可以看出,真正影响数据库字符集的其实是第三部分

所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文

二.字符集的相关知识:

2.1 字符集
实质就是按照一定的字符编码方案,对一组特定的符号,分别赋予不同数值编码的集合。 Oracle 数据库最早支持的编码方案是 US7ASCII
Oracle
的字符集命名遵循以下命名规则 :
<Language><bit size><encoding>
: < 语言 >< 比特位数 >< 编码
>
比如 : ZHS16GBK 表示采用 GBK 编码格式、 16 位(两个字节)简体中文字符集


2.2
字符编码方案


2.2.1
单字节编码
1 单字节 7 位字符集 ,可以定义 128 个字符,最常用的字符集为 US7ASCII
2 单字节 8 位字符集 ,可以定义 256 个字符,适合于欧洲大部分国家

例如: WE8ISO8859P1( 西欧、 8 位、 ISO 标准 8859P1 编码 )

2.2.2 多字节编码
1 )变长多字节编码
某些字符用一个字节表示,其它字符用两个或多个字符表示,变长多字节编码常用于对亚洲语言的支持, 例如日语、汉语、印地语等
例如: AL32UTF8 (其中 AL 代表 ALL, 指适用于所有语言)、 zhs16cgb231280
2 )定长多字节编码

每一个字符都使用固定长度字节的编码方案,目前 oracle 唯一支持的定长多字节编码是 AF16UTF16 ,也是仅用于国家字符集

2.2.3 unicode 编码
Unicode
是一个涵盖了目前全世界使用的所有已知字符的单一编码方案,也就是说 Unicode 为每一个字符提供唯一的编码。 UTF-16 unicode 16 位编码方式 ,是一种定长多字节 编码,用 2 个字节表示一个 unicode 字符, AF16UTF16 UTF-16 编码字符集
UTF-8
unicode 8 位编码方式 ,是一种变长多字节 编码,这种编码可以用 1 2 3 个字节表示一个 unicode 字符, AL32UTF8 UTF8 UTFE UTF-8 编码字符集

2.3
字符集超级

当一种字符集(字符集 A )的编码数值包含所有另一种字符集(字符集 B )的编码数值,并且两种字符集相同编码数值代表相同的字符时,则字符集 A 是字符集 B 的超级,或称字符集 B 是字符集 A 的子集。
Oracle8i
oracle9i 官方文档资料中备有子集 - 超级对照表( subset-superset pairs ,例如: WE8ISO8859P1 WE8MSWIN1252 的子集。由于 US7ASCII 是最早的 Oracle 数据库编码格式,因此有许多字符集是 US7ASCII 的超集,例如 WE8ISO8859P1 ZHS16CGB231280 ZHS16GBK 都是 US7ASCII 的超集。

2.4
数据库字符集( oracle 服务器端字符集)

数据库字符集在创建数据库时指定,在创建后通常不能更改 。在创建数据库时,可以指定字符集 (CHARACTER SET) 和国家字符集 (NATIONAL CHARACTER SET)

2.4.1 字符集
(1)
用来存储 CHAR, VARCHAR2, CLOB, LONG 等类型数据
(2)
用来标示诸如表名、列名以及 PL/SQL 变量等
(3)
用来存储 SQL PL/SQL 程序单元等

2.4.2 国家字符集:
(1)
用以存储 NCHAR, NVARCHAR2, NCLOB 等类型数据
(2)
国家字符集实质上是为 oracle 选择的附加字符集,主要作用是为了增强 oracle 的字符处理能力,因为 NCHAR 数据类型可以提供对亚洲使用定长多字节编码的支持,而数据库字符集则不能。国家字符集在 oracle9i 中进行了重新定义,只能在 unicode 编码中的 AF16UTF16 UTF8 中选择,默认值是 AF16UTF16

2.4.3 查询字符集参数
可以查询以下数据字典或视图查看字符集设置情况
nls_database_parameters
props$ v$nls_parameters
查询结果中 NLS_CHARACTERSET 表示字符集 NLS_NCHAR_CHARACTERSET 表示国家字符集

2.4.4 修改数据库字符集
按照上文所说,数据库字符集在创建后原则上不能更改 。不过有 2 种方法可行。

1. 如果需要修改字符集,通常需要导出数据库数据,重建数据库,再导入数据库数据的方式来转换

2. 通过 ALTER DATABASE CHARACTER SET 语句修改字符集, 但创建数据库后修改字符集是有限制的,只有新的字符集是当前字符集的超集时才能修改数据库字符集 ,例如 UTF8 US7ASCII 的超集,修改数据库字符集可使用 ALTER DATABASE CHARACTER SET UTF8

2.5
客户端字符集( NLS_LANG 参数)


2.5.1
客户端字符集含义
客户端字符集定义了客户端字符数据的编码方式,任何发自或发往客户端的字符数据均使用客户端定义的字符集编码 , 客户端可以看作是能与数据库直接连接的各种应用,例如 sqlplus,exp/imp 等。客户端字符集是通过设置 NLS_LANG 参数来设定的。

2.5.2 NLS_LANG 参数格式
NLS_LANG=<language>_<territory>.<client character set>
Language:
显示 oracle 消息 , 校验,日期命名
Territory
指定默认日期、数字、货币等格式
Client character set
指定客户端将使用的字符集
例如: NLS_LANG=AMERICAN_AMERICA.US7ASCII
AMERICAN
是语言, AMERICA 是地区, US7ASCII 是客户端字符集

2.5.3 客户端字符集设置方法
1)UNIX
环境
$NLS_LANG=“simplified chinese”_china.zhs16gbk
$export NLS_LANG
编辑 oracle 用户的 profile 文件
2)Windows
环境
编辑注册表
Regedit.exe ---
HKEY_LOCAL_MACHINE --- SOFTWARE --- ORACLE-HOME

2.5.4 NLS 参数查询
Oracle
提供若干 NLS 参数定制数据库和用户机以适应本地格式,例如有 NLS_LANGUAGE ,NLS_DATE_FORMAT ,NLS_CALENDER 等,可以通过查询以下数据字典或 v$ 视图查看。
NLS_DATABASE_PARAMETERS:
显示数据库当前 NLS 参数取值,包括数据库字符集取值
NLS_SESSION_PARAMETERS
显示由 NLS_LANG 设置的参数,或经过 alter session 改变后的参数值(不包括由 NLS_LANG 设置的客户端字符集)
NLS_INSTANCE_PARAMETE
显示由参数文件 init<SID>.ora 定义的参数

V$NLS_PARAMETERS 显示数据库当前 NLS 参数取值

2.5.5 修改 NLS 参数
使用下列方法可以修改 NLS 参数
1 )修改实例启动时使用的初始化参数文件
2 )修改环境变量 NLS_LANG
3 )使用 ALTER SESSION 语句,在 oracle 会话中修改

4 )使用某些 SQL 函数
NLS
作用优先级别 Sql function > alter session > 环境变量或注册表 > 参数文件 > 数据库默认参数

三. EXP/IMP 字符集

3.1 EXP/IMP
Export
Import 是一对读写 Oracle 数据的工具。 Export Oracle 数据库中的数据输出到操作系统文件中 , Import 把这些文件中的数据读到 Oracle 数据库中,由于使用 exp/imp 进行数据迁移时,数据从源数据库到目标数据库的过程中有四个环节涉及到字符集,如果这四个环节的字符集不一致,将会发生字符集转换。
EXP
____________ _________________ _____________
|imp
导入文件 |<-| 环境变量 NLS_LANG|<-| 数据库字符集
|
------------ ----------------- -------------

IMP
____________ _________________ _____________
|imp
导入文件 |->| 环境变量 NLS_LANG|->| 数据库字符集
|
------------ ----------------- -------------

四个字符集是
1 )源数据库字符集
2 Export 过程中用户会话字符集(通过 NLS_LANG 设定)

3 Import 过程中用户会话字符集(通过 NLS_LANG 设定)
4 )目标数据库字符集

3.2
导出的转换过程

Export 过程中,如果源数据库字符集与 Export 用户会话字符集不一致,会发生字符集转换 ,并在导出文件的头部几个字节中存储 Export 用户会话字符集的 ID 号。在这个转换过程中可能发生数据的丢失。


: 如果源数据库使用 ZHS16GBK ,而 Export 用户会话字符集使用 US7ASCII ,由于 ZHS16GBK 16 位字符集 , US7ASCII 7 位字符集,这个转换过程中,中文字符在 US7ASCII 中不能够找到对等的字符,所以所有中文字符都会丢失而变成 “?? ” 形式,这样转换后生成的 Dmp 文件已经发生了数据丢失。
因此如果想正确导出源数据库数据,则 Export 过程中用户会话字符集应等于源数据库字符集或是源数据库字符集的超集

3.3
导入的转换过程

1 )确定导出数据库字符集环境
通过读取导出文件头,可以获得导出文件的字符集设置
2 )确定导入 session 的字符集,即导入 Session 使用的 NLS_LANG 环境变量
3 IMP 读取导出文件
读取导出文件字符集 ID ,和导入进程的 NLS_LANG 进行比较
4 )如果导出文件字符集和导入 Session 字符集相同,那么在这一步骤内就不需要转换, 如果不同,就需要把数据转换为导入 Session 使用的字符集。可以看出,导入数据到数据库过程中发生两次字符集转换


第一次 : 导入文件字符集与导入 Session 使用的字符集之间的转换,如果这个转换过程不能正确完成, Import 向目标数据库的导入过程也就不能完成。
第二次 : 导入 Session 字符集与数据库字符集之间的转换。

. 查看数据库字符集

涉及三方面的字符集,

1. oracel server 端的字符集 ;

2. oracle client 端的字符集 ;

3. dmp 文件的字符集。

在做数据导入的时候,需要这三个字符集都一致才能正确导入。

4.1 查询 oracle server 端的字符集

有很多种方法可以查出 oracle server 端的字符集,比较直观的查询方法是以下这种 :

SQL> select userenv('language') from dual;

USERENV('LANGUAGE')

----------------------------------------------------

SIMPLIFIED CHINESE_CHINA.ZHS16GBK

SQL>select userenv(‘language’) from dual;

AMERICAN _ AMERICA. ZHS16GBK

4.2 如何查询 dmp 文件的字符集

oracle exp 工具导出的 dmp 文件也包含了字符集信息, dmp 文件的第 2 和第 3 个字节记录了 dmp 文件的字符集 。如果 dmp 文件不大,比如只有几 M 或几十M ,可以用 UltraEdit 打开 (16 进制方式 ) ,看第 2 3 个字节的内容,如 0354 ,然后用以下 SQL 查出它对应的字符集 :

SQL> select nls_charset_name(to_number('0354','xxxx')) from dual;

ZHS16GBK

如果 dmp 文件很大,比如有 2G 以上 ( 这也是最常见的情况 ) ,用文本编辑器打开很慢或者完全打不开,可以用以下命令 ( unix 主机上 ):

cat exp.dmp |od -x|head -1|awk '{print $2 $3}'|cut -c 3-6

然后用上述 SQL 也可以得到它对应的字符集。

4.3 查询 oracle client 端的字符集

windows 平台下,就是

分享到:
评论

相关推荐

    Oracle 修改字符集

    9. **验证字符集修改**: - 查看数据库字符集: ```sql SQL&gt; select userenv('language') from dual; SQL&gt; show parameter nls_characterset; ``` #### 四、注意事项 - 在修改字符集前,请确保充分了解新旧...

    oracle字符集的查看和client字符集的修改

    ### Oracle字符集的查看与客户端字符集的修改 #### 一、Oracle字符集的基本概念 在Oracle数据库系统中,字符集(charset)是用于表示文本数据的编码方式。正确设置和管理字符集对于确保数据的一致性和正确性至关重要...

    oracle修改字符集

    Oracle数据库的字符集是决定数据库如何存储和处理字符数据的关键因素。在某些情况下,由于字符集不匹配,可能会导致数据导入导出时出现问题,比如提到的.dmp文件无法正常导入到其他数据库。针对这种情况,我们可以...

    Oracle 字符集详解

    本篇将深入探讨Oracle字符集的查看、修改、导入导出以及转换原理。 一、Oracle字符集的查看 在Oracle中,可以通过以下SQL查询来查看当前数据库的字符集设置: ```sql SELECT * FROM NLS_DATABASE_PARAMETERS ...

    怎样修改查看Oracle字符集及怎样修改字符集

    ### 如何查看与修改Oracle数据库字符集 ...通过上述方法,您可以有效地查看和修改Oracle数据库的字符集,从而确保数据的正确存储和检索。在进行任何修改之前,请务必充分了解所涉及的风险,并采取适当的数据保护措施。

    oracle 字符集修改命令

    ### Oracle字符集修改命令详解 #### 一、引言 在Oracle数据库的管理与维护过程中,字符集的正确设置对于确保数据的正确显示与处理至关重要。由于不同的地区和语言环境对于字符编码的需求各异,因此有时可能需要...

    oracle字符集查看与修改.pdf

    Oracle 字符集查看与修改 Oracle 字符集是一个字节数据的解释的符号集合,具有大小之分,具有相互的包容关系。Oracle 支持国家语言的体系结构允许使用本地化语言来存储、处理、检索数据。 一、什么是 Oracle 字符...

    oracle字符集快速修改注册表

    总之,Oracle字符集的正确选择和管理对于数据库的正常运行至关重要。通过快速修改注册表,我们可以便捷地在不同字符集之间切换,满足与不同数据库的兼容性需求。在日常工作中,理解并掌握字符集的相关知识,能有效...

    修改Oracle数据库字符集的方法

    在进行字符集修改之前,请确保满足以下前提条件: 1. **有足够的权限**:必须具备sysdba权限才能执行这些操作。 2. **备份数据库**:为避免意外情况导致数据丢失,在进行任何更改之前建议对整个数据库进行完整备份...

    修改oracle字符集.rar

    安装ORACLE数据库,字符集默认是AL32UTF8,有时需要改变数据库字符集,改成ZHS16GBK,资源里面是修改步骤。

    Oracle字符集转换

    ### Oracle字符集转换详解 #### 一、引言 在Oracle数据库管理中,字符集的选择至关重要,它直接关系到数据的正确存储与显示。当创建数据库时,如果选择了不合适的字符集,后续处理可能会遇到一系列问题。例如,在...

    Oracle_字符集的查看和修改

    ### Oracle 字符集的查看与修改 #### 一、Oracle 字符集概述 **Oracle 字符集** 是指 Oracle 数据库系统中用于解释字节数据的一组符号集合。Oracle 支持多国语言架构,这使得用户能够在不同的语言环境下存储、处理...

    修改oracle字符集

    文档详细的介绍了如何实现ORACLE数据库字符集的修改操作。

    oracle 字符集设置

    本文将深入探讨Oracle字符集的相关概念,包括如何通过设置环境变量来修改客户端字符集,以此解决因字符集差异而导致的数据转换或损耗问题。 #### Oracle字符集的重要性 Oracle数据库通过字符集支持多种语言环境下...

    oracle英文字符集插入到中文字符集

    "Oracle英文字符集插入到中文字符集"的主题聚焦于如何在不同字符集之间进行有效转换,以便在不修改客户端环境变量的情况下,实现数据的正确存储和检索。 Oracle数据库系统支持多种字符集,字符集决定了数据库如何...

    Linux下修改oracle字符集

    修改Oracle字符集需要一系列精确的操作步骤,并且需要数据库管理员具备一定的知识和经验。在执行字符集修改之前,首先需要通过Oracle提供的查询语句来查看当前的字符集设置。可以使用以下SQL命令来查看字符集: ```...

    Oracle字符集的问题.docx

    ### Oracle字符集问题详解 #### 一、问题背景 在使用Oracle数据库的过程中,经常会遇到字符集不一致导致的各种问题。特别是在使用PL/SQL Developer等工具连接数据库时,如果数据库字符集(Database Character Set...

Global site tag (gtag.js) - Google Analytics