5

从 Java 中不区分大小写地查询 SQL 数据库的经典方法如下:

String name = ...;  // get the user's input (case is unknown)
String sql = "select * from Person where lower(name) = ?";
Object jdbcBindVariable = name.toLowerCase();
// ... using JDBC, bind that variable and run the SQL query

问题是小写是特定于语言环境的操作。例如,小写字母“ I”在英语和土耳其语中给出不同的结果。在上面的代码中,有两个小写操作:

  • String#toLowerCase() 方法
  • lower() 数据库函数

如何确保 Java 和数据库使用相同的语言环境,从而执行有效的比较?

我知道 String 类有一个 toLowerCase(Locale) 方法,但是我怎么知道数据库使用的是什么 Locale 呢?我可以通过编程方式进行检查,还是必须将语言环境硬编码为我认为配置数据库(在本例中为 Oracle 10g)的语言环境?

4

2 回答 2

2

简单的答案是让数据库来做。这样,将绑定变量放入小写的方式将与将列值放入小写的方式一致。

String sql = "select * from Person where lower(name) = lower(?)";
于 2010-02-02T05:12:19.013 回答
1

...但是我怎么知道数据库使用的是什么语言环境?我可以以编程方式检查这个...

似乎没有可移植(独立于数据库)的方式来执行此操作,但您显然可以使用以下查询来获取 Orable 数据库使用的字符集:

select value from nls_database_parameters where parameter = 'NLS_CHARACTERSET';

此页面提供了更多详细信息。

至于实际进行比较,您最好 (*) 让数据库处理小写字母,正如@Gary 建议的那样。JDBC 驱动程序将负责将 Java (UTF-16) 字符串转换为数据库正在使用的任何内容。

(* 事实上,我认为您没有太多选择,除非您准备承担在数据库中存储所有可查询字符串的大小写混合副本的成本。)

于 2010-02-02T05:18:56.450 回答