这篇文章从原理开始讲,非常有质量:https://www.cnblogs.com/bingo1717/p/7803359.html
客户读端的字符集可以和oracle客户端设置得不一样(最好是一样,保持和数据库服务端一致),但是客户端字符集一定要和操作系统设置的字符集相匹配!
查看系统的字符编码
CMD输入:CHCP
936 中国 - 简体中文(GB2312)
客户端软件的字符集修改:
1 修改注册表:修改的是客户端的字符集。
HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/HOMExx/NLS_LANG
2 设置环境变量:
NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
Oracle数据库实例修改字符集
查看数据库服务器的字符编码
select * from nls_database_parameters; -- 数据库字符集
select * from nls_instance_parameters; -- 客户端字符集
select * from nls_session_parameters; -- session字符集,受NLS_LANG环境变量设置影响
可以看出:
(1)nls_database_parameters来源于props$,是表示数据库的字符集。在创建数据库的时候设定的,一般不会改变.
(2)v$nls_parameters 显示当前会话值 ,他受客户端nls 的控制。
所以2个视图的查询结果是可能不一样的。
其他几个相关的视图:
(1)nls_instance_parameters 其来源于v$parameter,表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表。
(2)nls_session_parameters 来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameters一致。
select userenv('language') from dual;
select * from ccrt_data;
insert into ccrt_data(NAME) VALUES('张三');
select * from v$nls_parameters where parameter='NLS_CHARACTERSET';
select userenv('language') from dual;
create table test(id number,var varchar2(30));
insert into test values(1,'中国');
select id,dump(var,1016) from test;
目前解决方案:
1 客户端OS和数据库服务器的OS都是936
2 数据库字符集编码在安装的时候选择简体中文
SIMPLIFIED CHINESE_CHINA.ZHS16GBK
3 客户端设置环境变量(影响session)
NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
以上不存在转换,不会乱码!