oracle中无法查询中文条件
淩度奢望 ✦ 暂无邮箱

初次装好PL/SQL,查询
1,select * from basecar 

--查询出来的结果中文全部为?
2,select * from basecar where truck_number='京AS888'
   --肯定是有数据的,但查不到,只要有中文就查不到
百度的结果是数据库服务器端和客户端字符集不一致导致的。

1
Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。它使数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。
2
影响oracle数据库字符集最重要的参数是NLS_LANG参数。
3
4
它的格式如下:   NLS_LANG = language_territory.charset
5
6
它有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。
7
8
其中:
9
10
Language 指定服务器消息的语言,territory 指定服务器的日期和数字格式,charset 指定字符集。如:AMERICAN _ AMERICA. ZHS16GBK
11
12
从NLS_LANG的组成我们可以看出,真正影响数据库字符集的其实是第三部分。
13
14
所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文。
15
16
如果检查的结果发现server端与client端字符集不一致,请统一修改为同server端相同的字符集。
查询服务器端的字符集
select userenv('language') from dual; 
select * from v$nls_parameters where parameter='NLS_CHARACTERSET';

 最重要的就是就是这个ZHS16GBK

客户端的字符集,我在注册表(HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE\KEY_OraClient11g_home1)中也没找到NLS_LANG,就当它与服务器端不一样吧。

 问题解决方法:
1,设置环境变量,NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
 2,重启PL/SQL,上面两个SQL查询就正常了。

但是还有其他问题...
项目需要,在windows服务中调用SQL查询,查询条件有中文,查不到数据,直接执行exe应用程序却可以查到数据,想不明白为什么...

不明白也要继续,在注册表中创建字符串值NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

 然后服务sql查询就正常了。

所以,简单、一步到位的做法就是在注册表中修改。

Submit
no comments yet~