如果客户端设定的字符集NLS_LANG和服务器端的字符集设定NLS_CHARACTERSET不一致的话,数据在客户端和服务器端进行流动时会有一个转换
客户端字符集<->UNICODE<->服务器端字符集
字符集一致的时候不会发生转换。
而sqlplus上显示的数据要求os的支持。
那么就可以知道产生乱码应该有以下几种
1.数据没有正确存储
当客户端字符集设定和服务器端字符集设定不一致的时候,客户端录入的字符无法正确转换为服务器端所支持的字符,也就是说录入字符属于客户端的字符集,但是不属于服务器端的字符集。这种情况下,字符是没有正确存入数据库,全部转换为默认字符“?”
解决方法:
a.服务器这种不支持的字符,不允许录入
b.客户端和数据库端的字符集都设定为支持录入字符的字符集
c.统一客户端和数据库端的字符集
d.使用unicode存储字符
2.数据没能正确读取
和1一样,如果服务器端原有的字符,无法正确转换为客户端字符,那么也会乱码
解决方法同1
3.数据的转换没有任何问题,而客户端无法支持
这个因为客户端app的局限性造成的,比如sqlplus就有很多字符集无法正确表示
解决方法:
a.把客户端的字符集NLS_LANG设定为app/os支持的字符集
b.如果app/os的字符集可更改,改成与客户端的字符集设定NLS_LANG同样
--------------
服务器端的字符集设置(一旦设置,一般不可更改)
select * from nls_database_parameters;
使用以下sql可查寻本次链接设置
select * from v$nls_parameters;