一、三个概念:
1. Oracle数据库服务器字符集:
select * from v$nls_parameters where parameter='NLS_CHARACTERSET';
2. 客户端操作系统字符集:
/etc/sysconfig/i18n设置
-
LANG="zh_CN.GB2312" (指定当前操作系统的字符集)
-
SUPPORTED="zh_CN.GB2312"(指定当前操作系统支持的字符集)
-
SYSFONT="lat0-sun16"(指定当前操作系统的字体)
3. 客户端NLS_LANG参数:该参数用于向Oracle指示客户端操作系统的字符集。
二、Oracle字符集转换的基本原则:
-
设置客户端的NLS_LANG为客户端操作系统的字符集
-
如果数据库字符集等于NLS_LANG,数据库和客户端传输字符时不作任何转换
-
如果它们俩不等,则需要在不同字符集间转换,只有客户端操作系统字符集是数据库字符集子集的基础上才能正确转换,否则会出现乱码。
三、最佳实践
插入过程:
”中国“两字在客户端操作系统字符集ZHS16GBK中的编码是”d6,d0,b9,fa",由于NLS_LANG和数据库字符集不同,Oracle会进行字符编码转换,也就是将字符集ZHS16GBK里“中国”的编码“d6,d0,b9,fa"转换为字符集"AL32UTF8"里”中国“的编码”e4,b8,ad,e5,9b,bd“。
读取过程:
数据库端读取的编码是”e4,b8,ad,e5,9b,bd“,由于NLS_LANG和数据库字符集不同,客户端对数据库端传过来的字符编码进行转换,数据库端字符集AL32UTF8里”中国“两字的编码”e4,b8,ad,e5,9b,bd“转换成客户端操作系统字符集ZHS16GBK里“中国”两字的编码“d6,d0,b9,fa",并正常显示。
经过了两次转换,都确实最正确、最推荐的方式。NLS_LANG只和客户端操作系统的字符集相关,如果客户端操作系统的字符集和数据库字符集间无法正确转换,则应该首先改变客户端终端的字符集,而不是简单地把NLS_LANG设为和数据库字符集一样。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25542870/viewspace-2144760/
,如需转载,请注明出处,否则将追究法律责任。