2009-09-03 8 views
1

、私は小さなテストをしました:Oracleの正規表現 - Oracleのデータベース10でエンコードする問題

SELECT REGEXP_REPLACE('İF', '[Iİ]F', 'DONE', 1, 0, 'i') 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; 

文字セットはです:クエリ以下

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

を「DONE」を返します。 UTF8

この正規表現を動作させるにはどうすればよいですか?

PS:トルコ語では、文字の大文字バージョン"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->İ

一つの可能​​な回避策があるに関するREGEXPの検索機能を使用してOracleの一部のバージョンにはバグがあるようです正確な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