如何使 Oracle 不区分大小写

Posted

技术标签:

【中文标题】如何使 Oracle 不区分大小写【英文标题】:How to make Oracle case insensitive 【发布时间】:2010-05-10 19:26:21 【问题描述】:

Oracle 10g 中是否有将数据视为不区分大小写的设置?我看到了一个解决方案here。但是,这是在会话中完成的。我正在寻找的是架构或表上的设置,以将其数据视为不区分大小写。如果它在会话中,那么我将不得不对所有存储过程进行更改。

【问题讨论】:

【参考方案1】:

没有使架构或表“不区分大小写”的选项。

您可以使用 NLS_ 参数在会话中执行此操作,也可以在影响整个实例的 db init 文件中执行相同操作。但是这些搜索只是案例- 对严格相等搜索不敏感。

如果您需要使用 LIKE,则需要考虑使用 REGEXP_LIKE。 在 REGEXP_LIKE 的情况下,您不需要 NLS_SORT 设置,因为 REGEXP_LIKE 有一个选项可以让它考虑不区分大小写的事情。

【讨论】:

【参考方案2】:

区分大小写是计算的基础,原因很简单,'yun' 的 ASCII 值!='YUN' 的 ASCII 值。所以,当你说...

将数据视为不区分大小写

...您的意思是仅仅为了搜索还是为了存储?

在每次搜索时强制大小写的问题是:

SQL> create table t23 (id number, name varchar2(20))
  2  /

Table created.

SQL> create unique index  t23_uk on t23(name)
  2  /

Index created.

SQL> insert into t23 values (1, 'SAM-I-AM')
  2  /

1 row created.

SQL> insert into t23 values (2, 'sam-i-am')
  2  /

1 row created.

SQL> select id, name, ascii(name) from t23
  2  /

        ID NAME                 ASCII(NAME)
---------- -------------------- -----------
         1 SAM-I-AM                      83
         2 sam-i-am                     115

SQL>

如果在架构或表级别强制执行不区分大小写的搜索,我们如何区分“sam-I-am”和“SAM-I-AM”?

虽然是在单个列级别,但可以强制执行不区分大小写的数据存储:

SQL> delete from t23
  2  /

2 rows deleted.

SQL> drop index t23_uk
  2  /

Index dropped.

SQL> create unique index  t23_uk on t23(upper(name))
  2  /

Index created.

SQL> insert into t23 values (1, 'SAM-I-AM')
  2  /

1 row created.

SQL> insert into t23 values (2, 'sam-i-am')
  2  /
insert into t23 values (2, 'sam-i-am')
*
ERROR at line 1:
ORA-00001: unique constraint (APC.T23_UK) violated


SQL>

【讨论】:

以上是关于如何使 Oracle 不区分大小写的主要内容,如果未能解决你的问题,请参考以下文章

Spring数据JPAexistsByField在MySQL中不区分大小写,如何使其区分大小写

如何在mysql中使字段区分大小写

如何使 LIKE 表现得不区分大小写?

如何使 yarp 匹配路径不区分大小写?

如何使这个 preg_match 不区分大小写?

如何使字段不区分大小写且唯一?