sql >> Base de Datos >  >> RDS >> Oracle

La expresión regular de Oracle que tiene un guión no da el mismo resultado en Windows que en Unix

Como dijo Avinash Raj en los comentarios, el guión en su patrón de expresión regular se interpreta como un rango. El comportamiento parece depender del algoritmo de clasificación que utilizan los dos clientes, según la variable de entorno NLS_LANG, que influye en el valor de NLS_SORT.

Con 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

Arriesgarse porque tu perfil dice que estás en Marruecos, con 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

La razón es que el segmento de patrón +-= se trata como un rango que cubre todos los caracteres desde + a = . En ISO8859-1 y conjunto de caracteres de Windows 1252 es decir, los caracteres del 43 al 61, y todos los dígitos numéricos que caen dentro de ese rango (por ejemplo, cero es 48) están dentro de ese rango, por lo que la expresión regular los reemplaza. Eso también es cierto en el conjunto de caracteres de Windows 1256 . (Y cualquier cosa basada en ASCII).

Pero su NLS_LANG también está cambiando implícitamente el orden de clasificación, y es cambiar de clasificación BINARIA a ÁRABE lo que cambia el comportamiento. Puedes ver eso dentro de una sola sesión; con 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

También puede decir que es un problema de rango modificando ligeramente el rango; cambiando +-= a +-3 por lo que no se incluyen los dígitos más altos, pero se deja todo lo demás igual:

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

Más información sobre clasificación lingüística .

Sin embargo, confiar en la configuración de NLS siempre es arriesgado, por lo que es mejor evitar el problema del rango por completo cambiando el patrón para tener el guión al principio o al final, lo que evita que se vea como un rango; de nuevo como sugirió Avinash Raj.