Oracle 字符集
1、 什么是 Oracle 字符集
Oracle 字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。 ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。 它是数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。 影响 Oracle 数据库字符集最重要的参数是 NLS_LANG 参数。 它的格式如下: NLS_LANG = language_territory.charset 它有三个组成部分(语言、地域和字符集),每个成分控制了 NLS 子集的特性。
Language: 指定服务器消息的语言, 影响提示信息是中文还是英文 Territory: 指定服务器的日期和数字格式, Charset: 指定字符集。
如:AMERICAN _ AMERICA. ZHS16GBK 从 NLS_LANG 的组成我们可以看出,真正影响数据库字符集的其实是第三部分。所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文。
2 、字符集的相关知识
2.1 字符集
实质就是按照一定的字符编码方案,对一组特定的符号,分别赋予不同数值编码的集合。Oracle 数据库最早支持的编码方案是 US7ASCII。
Oracle 的字符集命名遵循以下命名规则:
<Language><bit size><encoding>
即: <语言><比特位数><编码>
比如: ZHS16GBK 表示采用 GBK 编码格式、16 位(两个字节)简体中文字符集
2.2常见字符集
(1) ASCII(American Standard Code for Information Interchange,美国信息互换标准编码),单字节编码系统,7位(bits)表示一个字符,共128字符,字符值从0到127,其中32到126是可打印字符。ASCII字符集包括控制字符:回车键、退格、换行键等;可显示字符:英文大小写字符、阿拉伯数字和西文符号。
(2) Unicode( Universal Multiple-Octet Coded Character Set,通用多八位编码字符集),为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处编码方法。Unicode 标准使用十六进制、4字节的数字来表达每个字母、符号,或者表意文字,而且在书写时在前面加上前缀“U+”。
Unicode是字符集,有UTF-8、UTF-16、UTF-32是三种字符编码方案。
UTF-8(8-bit Unicode Transformation Format)是Unicode的8位可变长度字符编码方式,也是一种前缀码,AL32UTF8,UTF8、UTFE是UTF-8编码字符集。UTF-8使用1至4个字节为每个字符编码,可以用来表示Unicode标准中的任何字符,且其编码中的第一个字节仍与ASCII兼容,因此UTF-8是ASCII的一个超集,一个纯ASCII字符串也是一个合法的UTF-8字符串。互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码,在HTTP中,与字符集和字符编码相关的消息头是Accept-Charset/Content-Type。
UTF-16(16-bit Unicode Transformation Format)是unicode的16位编码方式,是一种定长多字节编码,用2个字节表示一个unicode字符,AF16UTF16是UTF-16编码字符集。
(3) ANSI码(American National Standards Institute,美国国家标准学会的标准码),不同国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。 不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。记事本程序默认以ANSI编码保存文档。
(4) GB2312(《GB 2312-1980信息交换用汉字编码字符集 基本集》),是中国国家标准的简体中文字符集。一个小于127的字符意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,高字节从0xA1到0xF7,低字节从0xA1到0xFE,可以组合出大约7000多个简体汉字,覆盖了汉字99.75%的使用频率,基本满足了汉字的计算机处理需要,在中国大陆和新加坡广泛使用。
(5) Big5,大五码或五大码,是使用繁体中文(正体中文)社区中最常用的电脑汉字字符集标准,共收录13,060个汉字。中文码分为内码及交换码两类,Big5属中文内码,知名的中文交换码有CCCII、CNS11643。Big5码是一套双字节字符集,使用了双八码存储方法,以两个字节来安放一个字。第一个字节称为"高位字节",第二个字节称为"低位字节"。"高位字节"使用了0x81-0xFE,"低位字节"使用了0x40-0x7E,及0xA1-0xFE。
3、oracle 服务端字符集
数据库字符集在创建数据库时指定,在创建后通常不能更改。在创建数据库时,可以指定字符集 (CHARACTER SET) 和国家字符集 (NATIONAL CHARACTER SET)。
--查看数据库服务端字符集
select userenv('language') from dual;
SIMPLIFIED: CHINESE_CHINA.ZHS16GBK
SIMPLIFIED:服务器是中文环境
CHINESE_CHINA:服务器是中国(时区也是中国时区)
ZHS16GBK:字符集类型
大部分情况下不建议修改已有数据库对字符集进行修改,就算修改也只能修改成当前字符集的超集。
4、客户端字符集
客户端字符集定义了客户端字符数据的编码方式,任何发自或发往客户端的,字符数据均使用客户端定义的字符集编码,客户端可以看作是能与数据库直接连,接的各种应用,例如 sqlplus,exp/imp 等。客户端字符集是通过设置 NLS_LANG参数来设定的。
NLS_LANG=AMERICAN_AMERICA.US7ASCII
AMERICAN 是语言,AMERICA 是地区,US7ASCII 是客户端字符集
5、EXP/IMP 与 字符集
5.1、exp/imp字符集
Export 和 Import 是一对读写 Oracle 数据的工具。Export 将 Oracle 数据库中的数据输出到操作系统文件中, Import 把这些文件中的数据读到 Oracle 数据库中,由于使用 exp/imp 进行数据迁移时,数据从源数据库到目标数据库的过程中有四个环节涉及到字符集,如果这四个环节的字符集不一致,将会发生字符集转换。
四个字符集是
(1)源数据库字符集
(2)Export 过程中用户会话字符集(通过 NLS_LANG 设定)
(3)Import 过程中用户会话字符集(通过 NLS_LANG 设定)
(4)目标数据库字符集
5.2、导出的转换过程
在 Export 过程中,如果源数据库字符集与 Export 用户会话字符集不一致,会发生字符集转换,并在导出文件的头部几个字节中存储 Export 用户会话字符集的 ID 号。在这个转换过程中可能发生数据的丢失。
例:如果源数据库使用 ZHS16GBK,而 Export 用户会话字符集使用US7ASCII,由于 ZHS16GBK 是 16 位字符集,而 US7ASCII 是 7 位字符集,这个转换过程中,中文字符在 US7ASCII 中不能够找到对等的字符,所以所有中文字符都会丢失而变成―?? ‖形式,这样转换后生成的 Dmp 文件已经发生了数据丢失。因此如果想正确导出源数据库数据,则 Export 过程中用户会话字符集应等于源数据库字符集或是源数据库字符集的超集。
5.3、导入的转换过程
(1)确定导出数据库字符集环境通过读取导出文件头,可以获得导出文件的字符集设置。
(2)确定导入 session 的字符集,即导入 Session 使用的 NLS_LANG 环境变量。
(3)IMP 读取导出文件读取导出文件字符集 ID,和导入进程的 NLS_LANG 进行比较。
(4)如果导出文件字符集和导入 Session 字符集相同,那么在这一步骤内就不需要转换,如果不同,就需要把数据转换为导入 Session 使用的字符集。可以看出,导入数据到数据库过程中发生两次字符集转换。
第一次:导入文件字符集与导入 Session 使用的字符集之间的转换,如果这个转换过程不能正确完成,Import 向目标数据库的导入过程也就不能完成。
第二次:导入 Session 字符集与数据库字符集之间的转换。




