xtky_limi 发表于 2011-12-22 18:50

oracle字符集总结

一.字符集基本含义:

1.基本含义

字符集的实质就是对一组特定的符号,分别赋予不同的数值编码,以便于计算机的处理。
字符集之间的转换。字符集多了,就会带来一个问题,比如一个字符,在某一字符集中被编码为一个数值,而在另一个字符集中被编码为另一个数值,比如我来创造两个字符集demo_charset1与demo_charset2,在demo_charset1中,我规定了三个符号的编码为:A(0001),B(0010),?(1111);而在demo_charset2中,我也规定了三个符号的编码为:A(1001),C(1011),?(1111),这时我接到一个任务,要编写一个程序,负责在demo_charset1与demo_charset2之间进行转换。由于知道两个字符集的编码规则,对于demo_charset1中的0001,在转换为demo_charset2时,要将其编码改为1001;对于demo_charset1中的1111,转换为demo_charset2时,其数值不变;而对于demo_charset1中的0010,其对应的字符为B,但在demo_charset2没有对应的字符,所以从理论上无法转换,对于所有这类无法转换的情况,我们可以将它们统一转换为目标字符集中的一个特殊字符(称为“替换字符”),比如在这里我们可以将?作为替换字符,所以B就转换为了?,出现了信息的丢失;同样道理,将demo_charset2的C字符转换到demo_charset1时,也会出现信息丢失。
所以说,在字符集转换过程中,如果源字符集中的某个字符在目标字符集中没有定义,将会出现信息丢失。
数据库字符集的选择。
我们在创建数据库时,需要考虑的一个问题就是选择什么字符集与国家字符集(通过create database中的CHARACTER SET与NATIONAL CHARACTER SET子句指定)。考虑这个问题,我们必须要清楚数据库中都需要存储什么数据,如果只需要存储英文信息,那么选择US7ASCII作为字符集就可以;但是如果要存储中文,那么我们就需要选择能够支持中文的字符集(如ZHS16GBK);如果需要存储多国语言文字,那就要选择UTF8了。
数据库字符集的确定,实际上说明这个数据库所能处理的字符的集合及其编码方式,由于字符集选定后再进行更改会有诸多的限制(一般情况下只能更改的字符集是当前字符集的超集才可以),所以在数据库创建时一定要考虑清楚后再选择。
而我们许多朋友在创建数据库时,不考虑清楚,往往选择一个默认的字符集,如WE8ISO8859P1或US7ASCII,而这两个字符集都没有汉字编码,所以用这种字符集存储汉字信息从原则上说就是错误的。虽然在有些时候选用这种字符集好象也能正常使用,但它会给数据库的使用与维护带来一系列的麻烦,在后面的迭代过程中我们将深入分析。
2.字符集组成

oracle数据库字符集一般通过参数NLS_LANG配置,NLS_LANG由以下部分组成:

<Language>_<Territory>.< Characterset>

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

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

Charset:指定字符集。

最常见的字符集有:

AL32UTF8

WE8ISO8859P1

US7ASCII

ZHS16GBK

最常见的语言

AMERICAN_AMERICA

SIMPLIFIED CHINESE_CHINA



二.查询配置字符集

1.数据库字符集(oracle服务端字符集)
(1).可以查询以下数据字典或视图查看字符集设置情况
nls_database_parameters、props$、v$nls_parameters
NLS_CHARACTERSET表示字符集,

NLS_NCHAR_CHARACTERSET表示国家字符集

(2).通过查询语句

Select userenv(‘language’) from dual;



2.客户端字符集

(1).windows环境通过注册表配置NLS_LANG.

(2).LINUX环境通过配置环境变量$NLS_LANG,一般是.bashrc或.cshrc中进行配置.



三.字符集总结

1.字符集决定数据存储格式及内容。

2.字符集中的国家地区及语言决定连接数据库提示的语言以及日期格式显示的语言。

3.客户端字符集必须和服务端字符集保持一致,否则会出现乱码或字符错误。


来源:http://blog.chinaunix.net/space.php?uid=261392&do=blog&id=2850231
页: [1]
查看完整版本: oracle字符集总结