如何在Oracle SQL中对结果进行不区分大小写的排序?

时间:2010-02-02 01:42:15

标签: sql database oracle locale case-insensitive

从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)配置的语言环境?

2 个答案:

答案 0 :(得分:2)

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

String sql = "select * from Person where lower(name) = lower(?)";

答案 1 :(得分:1)

  

...但我怎么知道数据库使用的Locale?我可以通过编程方式检查...

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

select value from nls_database_parameters where parameter = 'NLS_CHARACTERSET';

This page提供了更多详细信息。

至于实际进行比较,你最好(*)让数据库照顾下层套管,正如@Gary建议的那样。 JDBC驱动程序将负责将Java(UTF-16)字符串转换为数据库正在使用的任何字符串。

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