SQL Like运算符不返回带有阿拉伯字符的数据

时间:2016-11-17 07:48:14

标签: c# sql oracle

我有一个使用" 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时,它可以很好地兼容阿拉伯语和英语。

任何帮助将不胜感激。

1 个答案:

答案 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条件中的硬编码字符串。