关于字符集的问题以及linux环境下出现的oracle乱码问题的一些总结

一:预备知识:什么是字符集?

字符集就是按照一定的字符编码方案,对一组

特定的符号,分别赋予不同数值编码的集合。

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

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

?比如: ZHS16GBK表示采用GBK编码格式、16

(两个字节)简体中文字符集

为什么要讨论字符集?

搞清常用编码特性是解决字符集编码问题的基础。字符集编码的识别与转换、分析各种乱码产生的原因、编程操作各种编码字符串(例如字符数计算、截断处理)等都需要弄清楚编码的特性。

 

二:遇到的问题1:字符集设置问题,在linuxoracle服务器无法使用中文字,或者出现乱码的问题。

 

解决方法:先通过命令:select * from v$nls_parameters;

或者直接select userenv(‘language’) from dual;--这样快点

如图:


--查询出客户端的字符集,因为我在安装数据库的时候是选择多种语言支持的,所以只要修改客户端的字符集就行了。还有上面查出来的AL32UTF-8是建立数据库的时候设置的,一般不建议修改,AL32UTF-8支持多国语言,所以建议大家也选这个。

关于SIMPLIFIED CHINESE_CHINA.AL32UTF8的解释:

影响Oracle数据库字符集最重要的参数是NLS_LANG参数。

它的格式如下: NLS_LANG = language_territory.charset

它有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。

其中:

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

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

Charset:  指定字符集。

如:AMERICAN _ AMERICA. ZHS16GBK

从NLS_LANG的组成我们可以看出,真正影响数据库字符集的其实是第三部分。

所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文。比如我现在用

 

然后进入Oracle的用户的环境变量 vi .bash_profile

在最后输入 export NLS_LANG=" SIMPLIFIED CHINESE_CHINA.AL32UTF8"就行了

 


关于AL32UTF8的解释:

UTF-8 是unicode的8位编码方式(Unicode也可以说是UCS字符集),是一种变长多

字节编码,这种编码可以用1、2、3个字节表

示一个unicode字符,AL32UTF8,UTF8、UTFE是

UTF-8编码字符集,可以理解为unicode是对字符集的定义,定义了所收录的字符和字符位置,而UTF-8是实际计算机环境中支持这种字符集的编码,或者说是UTF-8是Unicode实际应用的一种编码方式,而 AL32UTF8是从UTF-8衍生出来的支持所有语言的一种字符集

AL32UTF8(其中AL代表ALL,指适用于所

有语言)

 

三:有关Oracle数据库字符集设置的相关的讨论

查看数据库当前字符集参数设置 --注意这里查出来的是服务端的字符集设置
SELECT * FROM v$nls_parameters;

select * from nls_database_parameters

select userenv(‘language’) from dual;

数据库服务器字符集select * from nls_database_parameters,其来源于props$,是表示数据库的字符集。     客户端字符集环境select * from nls_instance_parameters,其来源于v$parameter
 
查询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
SIMPLIFIED CHINESE_CHINA.AL32UTF8
查询oracle client端的字符集 windows平台下,就是注册表里面相应OracleHomeNLS_LANG。还可以在dos窗口里面自己设置, 比如: set nls_lang=AMERICAN_AMERICA.ZHS16GBK 这样就只影响这个窗口里面的环境变量。   unix平台下,就是环境变量NLS_LANG $echo $NLS_LANG

AMERICAN_AMERICA.ZHS16GBK
   如果检查的结果发现server端与client端字符集不一致,请统一修改为同server端相同的字符集。
 

 

问题2Oracle v$nls_parameters 和 nls_database_parameters 区别

(1)nls_database_parameters来源于props$,是表示数据库的字符集。在创建数据库的时候设定的,一般不会改变.

(2)v$nls_parameters 显示当前会话值 ,他受客户端nls 的控制。

所以2个视图的查询结果是可能不一样的。

其他几个相关的视图:

(1)nls_instance_parameters 其来源于v$parameter,表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表。

(2)nls_session_parameters 来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameters一致。

 
呵呵 刚刚学着做笔记,感觉乱乱的,上面有很多是网上查找资料的,然后再自己归纳一下。多多支持哈。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29840459/viewspace-1302616/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29840459/viewspace-1302616/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值