Avinash Rajがコメントで述べたように、正規表現パターンのハイフンは範囲として解釈されています。この動作は、NLS_SORT値に影響を与えるNLS_LANG環境変数に基づいて、2つのクライアントで使用されている並べ替えアルゴリズムに依存しているようです。
NLS_LANG=ENGLISH_UNITED KINGDOM.WE8ISO8859P1
を使用 :
SQL> select REGEXP_REPLACE ('TEST 3304 V2', '[`[email protected]#$%^&*()_+-={}|;.:<>?,./]', ' ') as REG from dual;
REG
------------
TEST V
SQL> select value from nls_session_parameters where parameter = 'NLS_SORT';
VALUE
----------
BINARY
NLS_LANG="ARABIC_MOROCCO.AR8MSWIN1256"
を使用して、プロフィールにモロッコにいると表示されているので、手足に出かけます。 :
SQL> select REGEXP_REPLACE ('TEST 3304 V2', '[`[email protected]#$%^&*()_+-={}|;.:<>?,./]', ' ') as REG from dual;
REG
------------
TEST 3304 V2
SQL> select value from nls_session_parameters where parameter = 'NLS_SORT';
VALUE
----------
ARABIC
その理由は、パターンセグメント+-=
+
のすべての文字をカバーする範囲として扱われます =
へ 。 ISO8859-1および
ただし、NLS_LANGは暗黙的に並べ替え順序も変更しており、動作を変更するのはBINARYからARABICの並べ替えに切り替わります。あなたは単一のセッション内でそれを見ることができます。 NLS_LANG=ENGLISH_UNITED KINGDOM.WE8ISO8859P1
を使用 :
SQL> select REGEXP_REPLACE ('TEST 3304 V2', '[`[email protected]#$%^&*()_+-={}|;.:<>?,./]', ' ') as REG from dual;
REG
------------
TEST V
SQL> alter session set NLS_SORT=ARABIC;
Session altered.
SQL> select REGEXP_REPLACE ('TEST 3304 V2', '[`[email protected]#$%^&*()_+-={}|;.:<>?,./]', ' ') as REG from dual;
REG
------------
TEST 3304 V2
範囲を少し変更することで、範囲の問題であることがわかります。 +-=
を変更する +-3
へ したがって、上位の数字は含まれませんが、他のすべては同じままです:
SQL> alter session set NLS_SORT=BINARY;
Session altered.
SQL> select REGEXP_REPLACE ('TEST 3304 V2', '[`[email protected]#$%^&*()_+-3{}|;.:<>?,./]', ' ') as REG from dual;
REG
------------
TEST 4 V
言語ソートの詳細 。
ただし、NLS設定に依存することは常に危険です。したがって、パターンを最初または最後にハイフンを付けるように変更して範囲の問題を完全に回避することをお勧めします。これにより、範囲として表示されなくなります。再びAvinashRajが提案したように。