代码之家  ›  专栏  ›  技术社区  ›  Andrew Swan

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

  •  5
  • Andrew Swan  · 技术社区  · 16 年前

    从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?我可以通过编程检查这个区域,还是必须将该区域设置硬编码为我认为数据库(在本例中是Oracle10g)配置时使用的区域设置?

    2 回复  |  直到 9 年前
        1
  •  2
  •   Gary Myers    16 年前

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

    String sql = "select * from Person where lower(name) = lower(?)";
    
        2
  •  1
  •   Stephen C    16 年前

    …但我如何知道数据库使用的是什么区域设置?我可以用程序检查这个吗…

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

    select value from nls_database_parameters where parameter = 'NLS_CHARACTERSET';
    

    This page 提供更多详细信息。

    至于实际进行比较,最好是让数据库处理下套管,正如@gary建议的那样。JDBC驱动程序将负责将Java(UTF 16)字符串转换成数据库使用的任何内容。

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

    推荐文章