【问题标题】:How to sort results case-insensitive in Oracle SQL?如何在 Oracle SQL 中对结果进行不区分大小写的排序?
【发布时间】:2010-02-02 01:42:15
【问题描述】:

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

【问题讨论】:

    标签: sql database oracle locale case-insensitive


    【解决方案1】:

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

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

    【讨论】:

    • 这么简单,没想到。
    【解决方案2】:

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

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

    select value from nls_database_parameters where parameter = 'NLS_CHARACTERSET';
    

    This page 提供更多详细信息。

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

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

    【讨论】:

    • “Orable 数据库” - 弗洛伊德的失误? :-)
    • 天哪!那是怎么溜进来的? :-)
    猜你喜欢
    • 2011-01-25
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 2015-02-21
    • 2013-04-17
    • 1970-01-01
    相关资源
    最近更新 更多