Oracle 的字符集
1、字符集基本概念
Character set
字符集是某系统支持的所有抽象字符(各种文字和符号的总称)的集合,包括各国家文字、标点、图形、数字等。Oracle字符集命名规则:
字符编码指怎么将字符变成字节用于保存、读取和传输。
单字节编码
单字节7位字符集,可定义128个字符,最常用的为US7ASCII,oracle最早支持的编码方案 单字节8位字符集,可定义256个字符,适合欧洲大部分国家 WE8ISO8859P1(西欧、8位) 多字节编码
变长多字节编码,某些字符用一个字节,某些字符用两个或多个字符表示,变长多字节编码常用于对亚洲语言的支持例如日语、汉语、印语等。AL32UTF8(AL代表ALL,指适用于所有地区)、zhs16cgb231280
定长多字节编码,每一个字符都使用固定长度字节的编码方案,目前oracle唯一支持的定长多字节编码是AF16UTF16,也是仅用于国家字符集。
Unicode 字符集
几乎包含人类所有可用的字符,每年还在不断的增加,可以看作是一种通用的字符集。它将全世界所有的字符统一化,统一编码,不会再出现字符不兼容和字符转换的问题。
UTF-16是unicode的16位编码方式,是一种定长多字节编码,用2个字节表示一个unicode字符。
UTF-8是unicode的8位编码方式,是一种变长多字节编码,这种编码可以用1、2、3个字节表示一个unicode字符,AL32UTF8,UTF8、UTFE是UTF-8编码字符集
字符集超级
当一种字符集A的编码数值包含所有另一种字符集B的编码数值,并且两种字符集相同编码数值代表相同的字符时,则字符集A是字符集B的超级或称字符集B是字符集A的子集。Oracle8i和oracle9i官方文档资料中有子集-超级对照表(subset-superset pairs)例如:WE8ISO8859P1是WE8MSWIN1252的子集。由于US7ASCII是最早的Oracle数据库编码格式因此有许多字符集是US7ASCII的超集,例如WE8ISO8859P1、ZHS16CGB231280、ZHS16GBK都是US7ASCII的超集。
2、Oracle字符集基本原理
Oracle 通过NLS_LANG=language_territory.charset 设定对语言和字符集的支持,如
AMERICAN_AMERICA.AL32UTF8,其实真正影响数据库字符集是第三部分。两个数据库的NLS_LANG只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文。在一个创建好的数据库中这个参数是分部分存储,而且不建议修改。比如通过pfile 中的nls_language= 查看数据库的默认语言支持。
国家字符集实质上是为oracle选择的附加字符集,主要作用是为增强oracle的字符处理能力,因为NCHAR数据类型可以提供对亚洲使用定长多字节编码的支持,而数据库字符集则不能。国家字符集在oracle9i中进行了重新定义,只能在unicode编码中的AF16UTF16和UTF8中选择,默认值是AF16UTF16。
数据库的字符集
(即Oracle以哪种字符编码存储字符)
查看select * from v$nls_parameters where parameter='NLS_CHARACTERSET'; PARAMETER VALUE ----------------------------- -------- NLS_CHARACTERSET AL32UTF8
或select * from nls_database_parameters #显示oracle 默认的NLS和字符集的配置 操作系统字符集
客户端操作系统字符集决定输入字符的编码方式,如操作系统的字符集是ZHS16GBK,输入的字符“中”,在操作系统下这个字符的编码为“d6,d0”。客户端OS环境变量NLS_LANG=ZHS16GBK,则数据库知道传递的字符属于ZHS16GBK 字符集的编码,数据库收到”编码 d6,d0“后通过编码映射为UTF8 的编码“e4,b8,ad”存储。
1、Windows 可以使用chcp命令获得代码页(code page)
Active code page: 936 根据该代码页到《National Language Support (NLS) API Reference》
2、Linux 字符集在/etc/sysconfig/i18n或环境变量LANG设定 LANG=\指定当前操作系统的字符集) LANG=en_US.UTF-8
LANG=c#linux的默认字符集和语言设定
OS环境变量NLS_LANG
用于让Oracle数据库知道客户端操作系统使用的字符集和语言以便于Oracle在存储存客户传递的字符时做相应的编码映射,所以NLS_LANG只是起传递作用。如果数据库字符集等于NLS_LANG指定的字符集,数据库和客户端传输字符时不作任何转换,否则需要在不同字符集间转换,只有客户端操作系统字符集是数据库字符集的子集的基础上才能正确转换,否则会出现乱码。
NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK --windows NLS_LANG=american_america.AL32UTF8 --linux NLS_LANG='simplified chinese_china.AL32UTF8' --linux
数据库的NLS_LANG
a、 数据库默认NLS_LANG不会跟随客户端NLS_LANG变化 select * from nls_database_parameters
NLS_DATABASE_PARAMETERS 显示数据库的参数取值,包括数据库字符集取值 NLS_INSTANCE_PARAMETE 显示由参数文件init
b、数据库会话NLS_LANG 会跟随客户端NLS_LANG变化
select * from v$nls_parameters 或 select userenv('language') from fual;
Language 服务器消息语言,影响提示信息是中文或英文,跟随操作系统的NLS_LANG 变换 Territory 服务器的日期和数字格式,跟随操作系统的NLS_LANG 变换
Charset 字符集 #该字符集数据库字符集,不会跟随操作系统的NLS_LANG 变换
NLS_SESSION_PARAMETERS、V$NLS_PARAMETERS视图 显示和客户相关的nls 配置信息
3、OS环境变量NLS_LANG测试
1、Oracle字符集转换的基本原则