【Oracle】Oracle系列之三--Oracle字符集

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

文章目录

往期回顾

前言

1. 字符集定义

字符集Character Set按照一定的字符编码方案将特定的符号集编码为计算机能够处理的数值的集合。

常见字符集名称ASCII字符集、Unicode字符集、GB2312字符集、BIG5字符集、 GB18030字符集等。

每个字符集包含的字符个数不同在字符集转换过程中如果源字符集中的某个字符在目标字符集中没有定义将会出现信息丢失。

字符编码Character Encoding是一套规则能够使自然语言字符的一个集合如字母表或音节表与其他的一个集合如号码或电脉冲进行配对。即在符号集合与数字系统之间建立对应关系因此字符编码就是将语言符号转换为计算机可以接受的数字系统的数值。

如Unicode是字符集UTF-8、UTF-16、UTF-32是三种字符编码方案。

2. 常见字符集

1ASCIIAmerican Standard Code for Information Interchange美国信息互换标准编码单字节编码系统7位bits表示一个字符共128字符字符值从0到127其中32到126是可打印字符。ASCII字符集包括控制字符回车键、退格、换行键等可显示字符英文大小写字符、阿拉伯数字和西文符号。

2Unicode( Universal Multiple-Octet Coded Character Set通用多八位编码字符集)为每种语言中的每个字符设定了统一并且唯一的二进制编码以满足跨语言、跨平台进行文本转换、处编码方法。Unicode 标准使用十六进制、4字节的数字来表达每个字母、符号或者表意文字而且在书写时在前面加上前缀“U+”。

Unicode是字符集有UTF-8、UTF-16、UTF-32是三种字符编码方案。

UTF-88-bit Unicode Transformation Format是Unicode的8位可变长度字符编码方式也是一种前缀码AL32UTF8UTF8、UTFE是UTF-8编码字符集。UTF-8使用1至4个字节为每个字符编码可以用来表示Unicode标准中的任何字符且其编码中的第一个字节仍与ASCII兼容因此UTF-8是ASCII的一个超集一个纯ASCII字符串也是一个合法的UTF-8字符串。互联网工程工作小组IETF要求所有互联网协议都必须支持UTF-8编码在HTTP中与字符集和字符编码相关的消息头是Accept-Charset/Content-Type。

UTF-1616-bit Unicode Transformation Format是unicode的16位编码方式是一种定长多字节编码用2个字节表示一个unicode字符AF16UTF16是UTF-16编码字符集。

3ANSI码American National Standards Institute美国国家标准学会的标准码不同国家和地区制定了不同的标准由此产生了 GB2312 BIG5 JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式称为 ANSI 编码。在简体中文系统下ANSI 编码代表 GB2312 编码在日文操作系统下ANSI 编码代表 JIS 编码。 不同 ANSI 编码之间互不兼容当信息在国际间交流时无法将属于两种语言的文字存储在同一段 ANSI 编码的文本中。记事本程序默认以ANSI编码保存文档。

4GB2312《GB 2312-1980信息交换用汉字编码字符集 基本集》是中国国家标准的简体中文字符集。一个小于127的字符意义与原来相同但两个大于127的字符连在一起时就表示一个汉字高字节从0xA1到0xF7低字节从0xA1到0xFE可以组合出大约7000多个简体汉字覆盖了汉字99.75%的使用频率基本满足了汉字的计算机处理需要在中国大陆和新加坡广泛使用。

GBK是GB-2312-80的扩展是微软利用GB-2312-80未利用的编码空间收录GB13000.1-93全部字符制定的编码最早实现于Windows 95简体中文版。

GB-18030GB 18030-2005《信息技术 中文编码字符集》最新的内码字集是GB 18030-2000 《信息技术 信息交换用汉字编码字符集 基本集的扩充》的修订版与GB 2312-1980完全兼容与GBK基本兼容支持GB 13000及Unicode的全部汉字共收录汉字70244个主要有以下特点
与UTF-8相同采用多字节编码每个字可以由1个、2个或4个字节组成。
编码空间庞大最多可定义161万个字符。
支持中国国内少数民族的文字不需要动用造字区。
汉字收录范围包含繁体汉字以及日韩汉字

5Big5大五码或五大码是使用繁体中文正体中文社区中最常用的电脑汉字字符集标准共收录13060个汉字。中文码分为内码及交换码两类Big5属中文内码知名的中文交换码有CCCII、CNS11643。Big5码是一套双字节字符集使用了双八码存储方法以两个字节来安放一个字。第一个字节称为"高位字节"第二个字节称为"低位字节"。"高位字节"使用了0x81-0xFE"低位字节"使用了0x40-0x7E及0xA1-0xFE。

3. Oracle字符集

Oracle的字符集命名遵循以下命名规则:

<Language><bit size><encoding>

即: <语言><比特位数><编码>

比如: ZHS16GBK表示采用GBK编码格式、16位两个字节简体中文字符集
WE8ISO8859P1(西欧、8位、ISO标准8859P1编码)

3.1 Oracle Server端字符集

创建数据库时需要选择字符集与国家字符集通过create database中的CHARACTER SET与NATIONAL CHARACTER SET子句指定。

如果只需存储英文选择US7ASCII作为字符集就可以如果要存储中文需选择能够支持中文的字符集如ZHS16GBK如果存储多国语言文字要选择UTF8。

数据库字符集的确定实际上说明这个数据库所能处理的字符的集合及其编码方式由于字符集选定后再进行更改会有诸多的限制所以在数据库创建时一定要考虑清楚后再选择默认的字符集如WE8ISO8859P1或US7ASCII都没有汉字编码。

可通过查询数据字典或v$视图查看Oracle Server端字符集

查询语句如下

SQL>select userenv(language) from dual;
SQL>select * from nls_database_parameters where parameter='NLS_CHARACTERSET'
SQL>select * from v$nls_parameters where parameter='NLS_CHARACTERSET';
  • NLS_DATABASE_PARAMETERS来源于props$显示数据库当前NLS参数取值包括数据库字符集取值
  • NLS_INSTANCE_PARAMETERS来源于v$parameter表示服务端的字符集的设置可能是参数文件环境变量或者是注册表
  • NLS_SESSION_PARAMETERS来源于v$nls_parameters表示会话自己的设置可能是会话的环境变量或者是alter session改变后的参数值不包括由NLS_LANG 设置的客户端字符集。如果会话没有特殊的设置将与nls_instance_parameters一致
  • V$NLS_PARAMETERS显示数据库当前NLS参数取值。
    如果需要修改字符集通常需要导出数据库数据重建数据库再导入数据库数据的方式来转换。

创建数据库后修改字符集是有限制的只有新的字符集是当前字符集的超集时才能修改数据库字符集。

当一种字符集字符集A的编码数值包含所有另一种字符集字符集B的编码数值并且两种字符集相同编码数值代表相同的字符时则字符集A是字符集B的超级或称字符集B是字符集A的子集。

例如UTF8是US7ASCII的超集修改数据库字符集可使用如下语句

SQL>ALTER DATABASE CHARACTER SET UTF8

3.2 Oracle Client端字符集

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

客户端字符集是通过设置NLS_LANG参数来设定的NLS_LANG由以下部分组成

< Language>_<Territory>.<Clients Characterset>

如AMERICAN _ AMERICA. ZHS16GBK。

  • Language 指定消息的语言 影响提示信息是中文还是英文-
  • Territory 指定默认的日期和数字格式
  • Clients Characterset 指定字符集本意就是用来指明客户端操作系统缺省使用的字符集。所以按正规的用法NLS_LANG应该按照客户端机器的实际情况进行配置 真正影响数据库字符集的是第三部分。两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据前面影响的只是提示信息是中文还是英文。

NLS作用优先级别

Sql function > alter session > 环境变量或注册表 > 参数文件 > 数据库默认参数
查询oracle client端的字符集

Windows:

set nls_lang

Unix:

echo $NLS_LANG

如果检查发现server端与client端字符集不一致需要统一修改为同server端相同的字符集。

Windows:

set NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

或者修改注册表Regedit.exe –>HKEY_LOCAL_MACHINE->SOFTWARE->ORACLE-HOME

Unix:

export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

或者编辑oracle用户的profile文件

3.3 Oralce导入/导出 字符集

在用exp导出数据的时候imp导入时需要注意ORACLE字符集问题数据从源数据库到目标数据库的过程中有四个环节涉及到字符集分别是

1源数据库字符集
2Export过程中用户会话字符集通过NLS_LANG设定
3Import过程中用户会话字符集通过NLS_LANG设定
4目标数据库字符集
以上涉及三方面的字符集

oracel server端的字符集
oracle client端的字符集
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
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: oracle
返回列表

上一篇:oracle 递归

下一篇:MyBatis 篇