Oracle正则表达式 - 编码问题

时间:2009-09-03 14:03:34

标签: regex oracle encoding

在Oracle 10数据库中,我做了一个小测试:

SELECT REGEXP_REPLACE('İF', '[Iİ]F', 'DONE', 1, 0, 'i') FROM dual;

这似乎与正则表达式不匹配。但是,当我删除最后一个参数(不区分大小写的regex参数)时,正则表达式匹配:

SELECT REGEXP_REPLACE('İF', '[Iİ]F', 'DONE', 1, 0) FROM dual;

以下查询也会返回“完成”

SELECT REGEXP_REPLACE('IF', '[Iİ]F', 'DONE', 1, 0) FROM dual;
SELECT REGEXP_REPLACE('iF', '[Iİ]F', 'DONE', 1, 0, 'i') FROM dual;

数据库的字符集是 UTF8

我该怎么做才能使这个正则表达式工作?

PS:在土耳其语中,字符“i”的大写版本为“İ”

1 个答案:

答案 0 :(得分:2)

您可以使用Equivalence Class [[=i=]]

SQL> select regexp_replace('İF', '[[=i=]]f', 'DONE', 1, 0, 'i') from dual;

REGEXP_REPLACE('İF','[[=I=]]F'
------------------------------
DONE

SQL> select regexp_replace('if', '[[=i=]]f', 'DONE', 1, 0, 'i') from dual;

REGEXP_REPLACE('IF','[[=I=]]F'
------------------------------
DONE

修改:某些版本的Oracle似乎存在关于ı->Ii->İ

的REGEXP搜索功能的错误

一种可行的解决方法是使用NLS_UPPERNLS_LOWER函数,这些函数可以正确地使用正确的NLS_SORT设置:

SQL> alter session set nls_sort=XTURKISH;

Session altered

SQL> select regexp_replace(NLS_UPPER('İF'), 'İF', 'DONE', 1, 0) from dual;

REGEXP_REPLACE(NLS_UPPER('İF'
------------------------------
DONE

SQL> select regexp_replace(NLS_UPPER('if'), 'İF', 'DONE', 1, 0) from dual;

REGEXP_REPLACE(NLS_UPPER('IF')
------------------------------
DONE