一般情况下我们用的Oracle编码是UTF-8的
首先我们使用的客户端securityCRT设置了字符编码 是utf8,即使Sqlplus查询正确并返回相应UTF-8格式的值也是不能正确显示滴.
export LANG=zh_CN.UTF-8 (登陆时前台的编码问题)
LANG变量是language的简称,这个变量是决定系统的默认语言的,即系统的菜单、程序的工具栏语言、输入法默认语言等。
LANG变量清空,由于英语是无论什么情况都支持的,LANG变量被清空后,系统就默认用英语。这样设置后,在字符模式下输出的出错信息等就是全英文的了。但这种设置是临时的,只是临时改变了LANG这个bash变量而已。当退出重新登录或者切换到其他字符终端后就无效了。
export NLS_LANG=AMERICAN_AMERICA.UTF8 (解决sqlplus中 oracle中前台编码问题)
“NLS_LANG和数据库的字符集一样或许是正确的,但是经常是不对的。不要认为NLS_LANG必须和数据库的字符集一样,这经常是错的。” 《循序渐进Oracle》中说NLS_LANG一样的话可以提高性能,因为不需要字符集的转换。其实这样的转换不时发生在Server端,Client端 转换完成后传递给Server端。我觉得,只要NLS_LANG是Server的字符集的子集就可以。
“NLS_LANG的字符集设置不会更改Client端的字符集。它只是用来告诉Oracle你在Client端使用什么字符集,你不能通过设置NLS_LANG去影响Client的字符集”。而且如果Client端的字符集和NLS_LANG不兼容,会导致数据库乱码。
“如果你不在Client端设置NLS_LANG,那么默认会使用Server的NLS_LANG设置,这是错的。如果Oracle在安装时没有 设置NLS_LANG,那么NLS_LANG不会另外再设置,而是使用默认值:AMERICAN_AMERICA.US7ASCII。语言是 AMERICAN,区域是AMERICA,字符集US7ASCII”
“设置NLS_LANG的LANGUAGE 和 TERRITORY部分不会影响存储在数据库的字符。将NLS_LANG设置为JAPANESE_JAPAN.WE8MSWIN1252不会允许你存储日 文。因为WE8MSWIN1252字符集不支持日文。但是设置成AMERICAN_AMERICA.JA16SJIS会允许你存储日文,假设你输入的字符 是JA16SJIS,并且数据库的字符集也支持日文(如UTF8或者JA16SJIS)”