Oracle
 sql >> база данни >  >> RDS >> Oracle

Регулярният израз на Oracle с тире не дава същия резултат в Windows, както в Unix

Както Авинаш Радж каза в коментарите, тирето във вашия модел на регулярен израз се интерпретира като диапазон. Поведението изглежда зависи от алгоритъма за сортиране, използван от двата клиента, въз основа на променливата на средата 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 обаче винаги е рисковано, така че е по-добре да избегнете изцяло проблема с диапазона, като промените шаблона, за да имате тирето в началото или в края, което спира да се разглежда като диапазон изобщо; отново както Авинаш Радж предложи.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Java:Извикване на съхранена процедура в база данни на Oracle

  2. Oracle sql заявката трябва да се промени въз основа на часовата зона

  3. (+) =оператор в oracle sql в клауза where

  4. Oracle - Как да създам таблица, която има автоматично увеличаващ се уникален ключ за ID

  5. Процедури на Oracle в php със PDO