我有一个使用" LIKE"的查询语句。运算符从包含阿拉伯语&amp ;;的Oracle数据库中检索搜索结果。英文数据。它在" LIKE"之后就像一个带有英文字符的魅力,但它会检索带有阿拉伯字符的0条记录。
这是我的简化代码:
String whereSt = " WHERE Arb_NAME LIKE '%محمد' "; //Generated from caller method
String selectSt = " Select * from Users " + whereSt;
DynamicDBTable dDBT = new DynamicDBTable(this.dbConn, TableSpace.Users);
dDBT.SelectRecords(selectST,prm);
DataSet result = dDBT.FetchData();
奇怪的是,当我将(selectST)复制到SQL Developer时,它可以很好地兼容阿拉伯语和英语。
任何帮助将不胜感激。
答案 0 :(得分:0)
Oracle Data Provider从NLS_LANG
值继承字符集。将NLS_LANG
值设置为支持阿拉伯字符的字符集,例如NLS_LANG=ARABIC_BAHRAIN.WE8MSWIN1256
甚至更好ARABIC_BAHRAIN.AL32UTF8
您可以将NLS_LANG
设置为环境变量,也可以设置在HKLM\SOFTWARE\Wow6432Node\ORACLE\KEY_%ORACLE_HOME_NAME%\NLS_LANG
(适用于32位客户端)的注册表中。 HKLM\SOFTWARE\ORACLE\KEY_%ORACLE_HOME_NAME%\NLS_LANG
(对于64位客户端)。
如果NLS_LANG
值未设置,则Oracle会将其默认为AMERICAN_AMERICA.US7ASCII
,即不支持阿拉伯字符。
SQL Developer使用JDBC驱动程序连接到Oracle,但JDBC不使用NLS_LANG设置,这就是它在SQL Developer上运行的原因。见Database JDBC Developer's Guide - Globalization Support
从Oracle Database 10g开始,NLS_LANG变量不再是JDBC全球化机制的一部分。 JDBC驱动程序不检查NLS环境。因此,设置它没有任何效果。
除此之外,你应该更喜欢绑定变量而不是WHERE条件中的硬编码字符串。