【问题标题】:Making Oracle sorting case-insensitive?使Oracle排序不区分大小写?
【发布时间】:2015-02-21 02:39:53
【问题描述】:

这与使 oracle 排序不区分大小写有关。我见过的大多数解决方案都提到在会话参数下面设置:

ALTER SESSION SET NLS_COMP = LINGUISTIC;
ALTER SESSION SET NLS_SORT = BINARY_CI;

默认情况下 NLS_COMP 是 BINARY。

我发现如果我只是将 NLS_SORT 设置为 BINARY_CI 而没有将 NLS_COMP 设置为 LINGUISTIC,它仍然有效,即 oracle 排序变得不区分大小写。设置 NLS_COMP 参数有什么好处吗?

【问题讨论】:

  • 如果我想要一个不区分大小写的搜索,我会在搜索字段上使用上或下功能...说 UPPER(text) like '%SEARCH_STRING%'
  • 除非您有数百个查询需要不区分大小写的排序,否则我只会按 lower(field) 或 nlssort(field,'nls_sort=binary_ci') 排序。否则,您是在用安全性换取代码的简单性——大多数情况下,依赖于 nls 的代码是等待发生的意外。几年后,一些新的维护者或新软件将设置自己的会话参数,您的查询将默默地失败。
  • 我们确实有很多查询需要不区分大小写的排序。我们的要求是,如果我们按字符串排序,它必须不区分大小写

标签: sql oracle sorting nls-sort nls-comp


【解决方案1】:

NLS_COMPNLS_SORT 的效果略有不同。顾名思义,NLS_COMP 用于比较。顾名思义,NLS_SORT 用于排序。将NLS_COMP 设置为LINGUISTIC 会导致比较遵循排序规则,导致比较使用NLS_SORT 设置。试一试就能看出区别:

SELECT 1 FROM DUAL WHERE 'A' = 'a';

对于NLS_COMP = BINARY,比较结果为假。对于NLS_COMP = LINGUISTICNLS_SORT = BINARY_CI,比较结果为真。

是否应该设置取决于您希望从查询中获得什么结果。

【讨论】:

  • 好点。我读过的大多数文档都没有这种区别..让我相信不区分大小写的排序需要设置两个参数
猜你喜欢
  • 2019-01-31
  • 2020-09-13
  • 2012-06-22
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多