Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Der reguläre Oracle-Ausdruck mit einem Bindestrich liefert unter Windows nicht das gleiche Ergebnis wie unter Unix

Wie Avinash Raj in Kommentaren sagte, wird der Bindestrich in Ihrem regulären Ausdrucksmuster als Bereich interpretiert. Das Verhalten scheint vom Sortieralgorithmus abhängig zu sein, der von den beiden Clients verwendet wird, basierend auf der Umgebungsvariable NLS_LANG, die den Wert von NLS_SORT beeinflusst.

Mit 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

Gehen Sie mit NLS_LANG="ARABIC_MOROCCO.AR8MSWIN1256" auf die Beine, während Ihr Profil sagt, dass Sie in Marokko sind :

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

Der Grund dafür ist, dass das Mustersegment +-= wird als Bereich behandelt, der alle Zeichen von + abdeckt zu = . Im ISO8859-1 und Windows 1252-Zeichensatz das sind die Zeichen 43 bis 61, und alle numerischen Ziffern, die in diesen Bereich fallen – Null ist beispielsweise 48 – befinden sich in diesem Bereich, sodass die Regex sie ersetzt. Das gilt auch für den Windows 1256-Zeichensatz . (Und alles, was auf ASCII basiert).

Aber Ihr NLS_LANG ändert auch implizit die Sortierreihenfolge, und der Wechsel von BINARY zu ARABIC-Sortierung ändert das Verhalten. Sie können das innerhalb einer einzigen Sitzung sehen; mit 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

Sie können auch feststellen, dass es sich um ein Bereichsproblem handelt, indem Sie den Bereich leicht ändern. Ändern von +-= zu +-3 höhere Ziffern sind also nicht enthalten, aber alles andere bleibt gleich:

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

Lesen Sie mehr über sprachliche Sortierung .

Es ist jedoch immer riskant, sich auf NLS-Einstellungen zu verlassen, daher ist es besser, das Bereichsproblem vollständig zu vermeiden, indem Sie das Muster so ändern, dass es den Bindestrich am Anfang oder Ende hat, wodurch es überhaupt nicht mehr als Bereich angesehen wird. wieder, wie Avinash Raj vorgeschlagen hat.