Както Авинаш Радж каза в коментарите, тирето във вашия модел на регулярен израз се интерпретира като диапазон. Поведението изглежда зависи от алгоритъма за сортиране, използван от двата клиента, въз основа на променливата на средата NLS_LANG, която влияе върху стойността на NLS_SORT.
С 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 и набор от символи на Windows 1252
това са знаци от 43 до 61 и всички цифрови цифри попадат в този диапазон - нула е 48 например - са в този диапазон, така че регулярният израз ги замества. Това важи и за набора от знаци на Windows 1256
. (И всичко, базирано на 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 обаче винаги е рисковано, така че е по-добре да избегнете изцяло проблема с диапазона, като промените шаблона, за да имате тирето в началото или в края, което спира да се разглежда като диапазон изобщо; отново както Авинаш Радж предложи.