Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Ekspresi reguler Oracle yang memiliki tanda hubung tidak memberikan hasil yang sama di Windows seperti di Unix

Seperti yang dikatakan Avinash Raj dalam komentar, tanda hubung dalam pola ekspresi reguler Anda ditafsirkan sebagai rentang. Perilaku tampaknya bergantung pada algoritme pengurutan yang digunakan oleh dua klien, berdasarkan variabel lingkungan NLS_LANG, yang memengaruhi nilai NLS_SORT.

Dengan 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

Mengambil risiko karena profil Anda mengatakan bahwa Anda berada di Maroko, dengan 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

Alasannya adalah bahwa segmen pola +-= diperlakukan sebagai rentang yang mencakup semua karakter dari + ke = . Dalam ISO8859-1 dan kumpulan karakter Windows 1252 yaitu karakter 43 hingga 61, dan semua digit numerik termasuk dalam kisaran itu - nol adalah 48 misalnya - berada dalam kisaran itu, jadi regex menggantikannya. Itu juga berlaku di kumpulan karakter Windows 1256 . (Dan apa pun berdasarkan ASCII).

Tetapi NLS_LANG Anda juga secara implisit mengubah urutan pengurutan, dan beralih dari pengurutan BINARY ke ARABIC yang mengubah perilaku. Anda dapat melihatnya dalam satu sesi; dengan 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

Anda juga dapat mengetahui bahwa ini adalah masalah rentang dengan sedikit memodifikasi rentang; mengubah +-= ke +-3 jadi angka yang lebih tinggi tidak disertakan, tetapi yang lainnya tetap sama:

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

Baca selengkapnya tentang pengurutan linguistik .

Mengandalkan pengaturan NLS selalu berisiko, jadi lebih baik untuk menghindari masalah rentang sepenuhnya dengan mengubah pola untuk memiliki tanda hubung di awal atau akhir, yang menghentikannya dilihat sebagai rentang sama sekali; lagi seperti yang disarankan Avinash Raj.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle 11g - Temukan Catatan dalam CLOB dengan Umpan Jalur Pengembalian Kereta

  2. Urutan Oracle tetapi kemudian di MS SQL Server

  3. Kirim email dengan lampiran di Oracle D2k, Oracle Forms 10g, Oracle Forms 6i

  4. Bagaimana menemukan 48 jam kerja tanggal tidak termasuk Sabtu, Minggu dan hari libur di oracle

  5. Kerangka Entitas dan Oracle