主要参考文档:http://www.itpub.net/thread-933964-1-1.html
系统 --------------- 客户端 -----------------------数据库
Local nls_language nls_characterseet、nls_nchar_characterset
首先应该区分字符集跟语言国家选项这两个概念,字符集是编码方式,语言国家选项是显示的字符。有些编码支持多国语言,有些编码只对某一国语言进行支持。具体区分自己查资料吧。
常用的字符集
<language><bit size><enconding>
ZHS16GBK
ZHS16CGB231280
AL32UTF8
AL16UTF16
语言跟国家选项
AMERICAN_AMERICA
SIMPLIFIED CHINESE_CHINA
查看字符集的方法
Linux使用/etc/lsysconfig/i18n文件存放字符集国家设置信息。
客户端通过nls_language参数去区分字符集
数据库字符集可以登录进入数据库执行以下语句
Select * from nls_database_parameters where parameter like ‘%CHARACTERSET%’查看。
查询结果类似于
PARAMETER VALUE
------------------------------ ------------------------------
NLS_CHARACTERSET ZHS16GBK
NLS_NCHAR_CHARACTERSET AL16UTF16
其中NLS_CHARACTERSET为普通字符集,NLS_NCHAR_CHARACTERSET为国家字符集。
普通字符的转化发生在客户端。
若NLS_LANGUAGE环境变量未设置,则客户端的字符集取决于操作系统。与操作系统一致。当用户在应用端发生操作,客户端首先检查当前客户端的字符集是否与数据库的字符集一致,若一致,则直接将数据传送至服务器。若不一致,则会在客户端进行字符集的转换,把当前编码转换成数据库服务器字符集对应的编码后,再将编码信息上传到服务器。
而对于国家字符集,
客户端本身并不区分该字段是否为国家字符集类型,它仅是把该字符当做普通字符进行转化处理,上传至服务器,在服务器端,服务器根据其是否是国家字符集类型进行再次转换,即将国家字符集类型的字符将其从普通字符集编码转化为国家字符集编码。
在查询时,
服务器直接将存储在服务器端的编码原样返回,然后,客户端根据环境变量中的nls_lang和nls_nchar参数,判断是否要对返回的编码进行转化。若客户端没有设置nls_nchar参数,则认为其与nls_lang一样,不进行转化。
最后,在利用export和import工具进行导入导出时,这两个本身也是客户端工具,他们会根据nls_lang和nls_nchar参数进行转换,然后将此事的环境参数写入导出文件中,在导入的时候,会对比导入客户端中的字符集与导出文件中的字符集是否一致,若不一致,则先进行转化,然后再按照一般过程导入到服务端。