2009-09-03 4 views
1

오라클 (10) 데이터베이스에서, 나는 작은 시험을했다. 내가 마지막 매개 변수 (대소 문자 구분 정규식 매개 변수), 정규식 일치 제거 할 때, : 쿼리 아래오라클 정규식 인코딩 문제

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

을 반환을 "DONE": 데이터베이스의

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

문자 세트가 입니다 UTF8.

이 정규식 작업을 수행하려면 어떻게해야합니까?

추신 : 터키어, 문자의 대문자 버전 에서 "i"가"I"입니다.

답변

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 

편집 : ı->Ii->İ

한 가지 가능한 해결 방법은 대한의 정규 표현식 검색 기능과 오라클의 일부 버전에서 버그가 수 있도록이 보인다 올바른 NLS_SORT 설정으로 안정적으로 작동하는 NLS_UPPER 또는 NLS_LOWER 함수를 사용하려면

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