sql >> データベース >  >> RDS >> Oracle

ハイフンを含むOracle正規表現は、WindowsではUnixと同じ結果にはなりません。

    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およびWindows1252文字セット の場合 つまり、文字43〜61であり、すべての数字がその範囲内にあります(たとえば、ゼロは48です)がその範囲内にあるため、正規表現がそれらを置き換えます。これは、Windows1256文字セット にも当てはまります。 。 (そしてASCIIに基づくものは何でも)

    ただし、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が提案したように。




    1. MYSQLの結果で数値を単語に変換します!クエリの使用

    2. #1025-mysqlの名前変更(errno:150)でエラーが発生しました

    3. わずかな予算での高可用性-最小限の2ノードのMySQLGaleraクラスターの導入

    4. MySQL8日付によるパーティション分割による平均の計算