一、什么是
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
平台下,就是
分享到:
相关推荐
9. **验证字符集修改**: - 查看数据库字符集: ```sql SQL> select userenv('language') from dual; SQL> show parameter nls_characterset; ``` #### 四、注意事项 - 在修改字符集前,请确保充分了解新旧...
### Oracle字符集的查看与客户端字符集的修改 #### 一、Oracle字符集的基本概念 在Oracle数据库系统中,字符集(charset)是用于表示文本数据的编码方式。正确设置和管理字符集对于确保数据的一致性和正确性至关重要...
Oracle数据库的字符集是决定数据库如何存储和处理字符数据的关键因素。在某些情况下,由于字符集不匹配,可能会导致数据导入导出时出现问题,比如提到的.dmp文件无法正常导入到其他数据库。针对这种情况,我们可以...
本篇将深入探讨Oracle字符集的查看、修改、导入导出以及转换原理。 一、Oracle字符集的查看 在Oracle中,可以通过以下SQL查询来查看当前数据库的字符集设置: ```sql SELECT * FROM NLS_DATABASE_PARAMETERS ...
### 如何查看与修改Oracle数据库字符集 ...通过上述方法,您可以有效地查看和修改Oracle数据库的字符集,从而确保数据的正确存储和检索。在进行任何修改之前,请务必充分了解所涉及的风险,并采取适当的数据保护措施。
### Oracle字符集修改命令详解 #### 一、引言 在Oracle数据库的管理与维护过程中,字符集的正确设置对于确保数据的正确显示与处理至关重要。由于不同的地区和语言环境对于字符编码的需求各异,因此有时可能需要...
Oracle 字符集查看与修改 Oracle 字符集是一个字节数据的解释的符号集合,具有大小之分,具有相互的包容关系。Oracle 支持国家语言的体系结构允许使用本地化语言来存储、处理、检索数据。 一、什么是 Oracle 字符...
总之,Oracle字符集的正确选择和管理对于数据库的正常运行至关重要。通过快速修改注册表,我们可以便捷地在不同字符集之间切换,满足与不同数据库的兼容性需求。在日常工作中,理解并掌握字符集的相关知识,能有效...
在进行字符集修改之前,请确保满足以下前提条件: 1. **有足够的权限**:必须具备sysdba权限才能执行这些操作。 2. **备份数据库**:为避免意外情况导致数据丢失,在进行任何更改之前建议对整个数据库进行完整备份...
安装ORACLE数据库,字符集默认是AL32UTF8,有时需要改变数据库字符集,改成ZHS16GBK,资源里面是修改步骤。
### Oracle字符集转换详解 #### 一、引言 在Oracle数据库管理中,字符集的选择至关重要,它直接关系到数据的正确存储与显示。当创建数据库时,如果选择了不合适的字符集,后续处理可能会遇到一系列问题。例如,在...
### Oracle 字符集的查看与修改 #### 一、Oracle 字符集概述 **Oracle 字符集** 是指 Oracle 数据库系统中用于解释字节数据的一组符号集合。Oracle 支持多国语言架构,这使得用户能够在不同的语言环境下存储、处理...
文档详细的介绍了如何实现ORACLE数据库字符集的修改操作。
本文将深入探讨Oracle字符集的相关概念,包括如何通过设置环境变量来修改客户端字符集,以此解决因字符集差异而导致的数据转换或损耗问题。 #### Oracle字符集的重要性 Oracle数据库通过字符集支持多种语言环境下...
"Oracle英文字符集插入到中文字符集"的主题聚焦于如何在不同字符集之间进行有效转换,以便在不修改客户端环境变量的情况下,实现数据的正确存储和检索。 Oracle数据库系统支持多种字符集,字符集决定了数据库如何...
修改Oracle字符集需要一系列精确的操作步骤,并且需要数据库管理员具备一定的知识和经验。在执行字符集修改之前,首先需要通过Oracle提供的查询语句来查看当前的字符集设置。可以使用以下SQL命令来查看字符集: ```...
### Oracle字符集问题详解 #### 一、问题背景 在使用Oracle数据库的过程中,经常会遇到字符集不一致导致的各种问题。特别是在使用PL/SQL Developer等工具连接数据库时,如果数据库字符集(Database Character Set...