客户端字符集1、 客户端字符集含义
客户端字符集定义了客户端字符数据的编码方式,任何发自或发往客户端的字符数据均使用客户端定义的字符集编码,客户端可以看作是能与数据库直接连接的各种应用,例如sqlplus,exp/imp等。客户端字符集是通过设置NLS_LANG参数来设定的。2、NLS_LANG 参数格式
NLS_LANG= Language_ Territory. Client character se
Language: 显示Oracle消息、校验、日期命名
Territory :指定默认日期、数字、货币等格式
Client character set :指定客户端将使用的字符集
例如: NLS_LANG=AMERICAN_AMERICA.US7ASCII
AMERICAN是语言,AMERICA是地区,US7ASCII是客户端字符集
3、 客户端字符集设置方法
1)UNIX 环境
$NLS_LANG=“simplified chinese”_china.zhs16gbk
$export NLS_LANG
编辑oracle用户的.profile文件(或.bash_profile linux)
$ export NLS_LANG="SIMPLIFIED CHINESE"_CHINA.UTF8
2)Windows 环境
编辑注册表
Regedit.exe HKEY_LOCAL_MACHINE---SOFTWARE---ORACLE—HOME0
在DOS名下执行:
Set NLS_LANG=“simplified chinese”_china.zhs16gbk
4、 NLS 参数查询
Oracle 提供若干NLS参数定制数据库和用户机以适应本地格式,例如有NLS_LANGUAGE,NLS_DATE_FORMAT,NLS_CALENDER等,可以通过查询以下数据字典或v$视图查看。
NLS_DATABASE_PARAMETERS-- 显示数据库当前NLS参数取值,包括数据库字符集取值
NLS_SESSION_PARAMETERS-- 显示由NLS_LANG 设置的参数,或经过alter session 改变后的参数值(不包括由NLS_LANG 设置的客户端字符集)
NLS_INSTANCE_PARAMETE-- 显示由参数文件init.ora 定义的参数V$NLS_PARAMETERS--显示数据库当前NLS参数取值
图1-3查询NLS参数值5、 修改NLS参数
使用下列方法可以修改NLS参数(1)修改实例启动时使用的初始化参数文件
(2)修改环境变量 NLS_LANG
(3)使用ALTER SESSION语句,在oracle会话中修改
(4)使用某些SQL函数
NLS 作用优先级别:Sql function>alter session>环境变量或注册表>参数文件>数据库默认
SQL*Loader的字符集转换
使用SQL*Loader向数据库装载数据,有两种转换字符集的模式
常规路径: 数据被转换为 NLS_LANG 指定的会话字符集或者控制文件指定的字符集。
控制文件可以指定字符集
SQL*Loader control file:
LOAD DATA
CHARACTERSET UTF16
INFILE ulcase11.dat
REPLACE …
如果数据文件的字符集与NLS_LANG环境变量的字符集不一致,SQL*Loader以NLS_LANG指定的字符集编码存入数据库。
直接路径: 数据使用客户端指示被转换.
这样要求数据库的字符集是数据文件字符集的超级,否则有可能出现乱码。
乱码问题及解决办法
要在客户端正确显示ORACLE数据库中的汉字信息,首先必须使客户端的字符集与服务器端的字符集一致;其次是加载到ORACLE数据库的数据字符集必须与服务器字符集一致。据此,汉字显示乱码的问题大致可以分为以下几种情况:
1、客户端字符集与服务器端字符集不同,服务器端字符集与加载数据字符集一致。
如:
以system用户登录,创建表,插入数据。
图1-4乱码问题-正确的客户端字符集
图1-5乱码问题-不一致的客户端字符集这种情况是最常见的,只要把客户端的字符集设置正确即可。具体解决方案:
第一步:查询V$NLS_DATABASE_PARAMETERS得到服务端的字符集:SQL>SELECT * FROM V$NLS_DATABASE_PARAMETERS WHERE PARAMETER=’ NLS_CHARACTERSET;
PARAMETER VALUE
-----------------------------------------------------
NLS_CHARACTERSET ZHS16GBK
第二步:根据服务端的字符集设定客户端的字符集,设定方法参见客户端的字符集的设定方式。以LINUX系统为例,可在当前用户的.bash_profile文件中增加如下两行:
NLS_LANG=SIMPLIFIED Chinese_CHINA.ZHS16GBK
export NLS_LANG
2、客户端字符集与服务器端字符集相同,服务器端字符集与加载数据字符集不一致。这种情况一般发生在ORACLE版本升级或重新安装数据库时选择了与原来数据库不同的字符集,而恢复加载的备份数据仍是按原字符集卸出的场合。另一种情况是加载从其它使用不同字符集的ORACLE数据库卸出的数据。在这两种情况中,不管客户端字符集与服务器端字符集是否一致都无法正确显示汉字。如:
具体解决方案:
方案一:按服务端字符集的修改方法修改服务端字符集与加载数据字符集一致,然后导入数据。
方案二:利用数据格式转储,避开字符集带来的问题。即先将加载数据倒入到与其字符集一致的数据库中,然后再将数据要么按文本格式导出(数据量较小的情况下),要么通过第三方工具(如POWER BUILDER,ACCESS,FOXPRO等)倒出数据,最后将倒出的数据导入到目标数据库中。
3、客户端字符集与服务器端字符集不同,服务端字符集与输入数据字符集不同。这种情况是在客户端字符集与服务器端字符集不一致时,从客户端输入了汉字信息。输入的这些信息即便是把客户端字符集更改正确,也无法显示汉字。
如:
图1-6乱码问题—错误的客户端字符集
图1-7乱码问题—正确的客户端字符集
解决方案:修改客户端字符集与服务端字符集一致后,重新输入数据。