关键在于操作系统字符集、客户端字符集、数据库字符集这三者的关系
(1)操作系统字符集
查看方法:windows cmd窗口输入chcp
活动代码页(编码字符集的别名)
936 代表简体中文,GB2312字符集
(2)客户端字符集
修改注册表nls_lang 项的characterset ;
或设置设置环境变量NLS_LANG
查看:select userenv('language') from dual; --这是此次会话的编码,将环境变量NLS_LANG设置为这个查询结果就不会乱码。
(3)数据库字符集
这是服务器上数据库的字符集
在sql窗口 select * from NLS_DATABASE_PARAMETERS 可以查看;
往一张表里insert数据,其实会做2次转换,首先是从操作系统-->客户端,再客户端-->服务端。(后者一般不发生,因为字符集一般保持一致)
【比如:操作系统字符集:windows默认的简体中文GB2312
客户端、服务器端字符集(一般保持一致)为AL32UTF8
insert ’你好‘ 由C4E3 BAC3-->e4,bd,a0 e5,a5,bd
】
查询时也会做转换,是上述的逆过程。
决定显示字符的是操作系统的字符集,操作系统必须能将客户端的编码正确解码,才能正确显示字符,否则就会出现乱码。
随着软件的升级,现在一般常用字符集间都能映射,比如客户端AL32UTF8 操作系统GB2312,也能正常显示。似乎很少出现乱码问题啦(除非你去改数据库的编码,那么旧数据可能会乱码)。
好像一般也不用想那么多,只要数据库、操作系统设成支持中文的编码就好。乱码问题一般客户端软件就能帮你搞定啦。