sql - sintaxis - Diferencia entre los literales de N''String ''vs U''String'' en Oracle
regexp_like oracle (3)
cuando usamos N''
, denotamos que el tipo de datos dado es NCHAR
o NVARCHAR
.
U''
se utiliza para denotar unicode
¿Cuál es el significado y la diferencia entre estas consultas?
SELECT U''String'' FROM dual;
y
SELECT N''String'' FROM dual;
En esta respuesta trataré de proporcionar información de recursos oficiales.
(1) El texto N '''' Literal
N''''
se usa para convertir una cadena a un tipo de datos NCHAR
o NVARCHAR2
Según esta documentación de Oracle Oracle - Literales
La sintaxis de los literales de texto es la siguiente:
donde
N
on
especifica el literal utilizando el conjunto de caracteres nacional (datosNCHAR
oNVARCHAR2
).
También en este segundo artículo Oracle - Datatypes
El N''String''
se utiliza para convertir una cadena a un tipo de datos NCHAR
Del artículo mencionado anteriormente:
El siguiente ejemplo compara la columna
translated_description
de la tablapm.product_descriptions
con una cadena de conjunto de caracteres nacional :
SELECT translated_description FROM product_descriptions WHERE translated_name = N''LCD Monitor 11/PM'';
(2) La U '''' Literal
U''''
se utiliza para manejar los literales de cadena de SQL NCHAR en la interfaz de llamada de Oracle (OCI)
Basado en esta documentación de Oracle Programación con Unicode.
La Interfaz de llamada de Oracle (OCI) es la API de nivel más bajo que el resto de productos de acceso a la base de datos del lado del cliente utiliza. Proporciona una forma flexible para que los programas C / C ++ accedan a los datos Unicode almacenados en los tipos de datos
CHAR
yNCHAR
SQL. Al utilizar OCI, puede especificar mediante programación el conjunto de caracteres (UTF-8, UTF-16 y otros) para que los datos se inserten o recuperen. Accede a la base de datos a través de Oracle Net.
OCI es la API de nivel más bajo para acceder a una base de datos, por lo que ofrece el mejor rendimiento posible.
Manejo de cadenas de caracteres de SQL NCHAR en OCI
Puede
ORA_NCHAR_LITERAL_REPLACE
configurando la variable de entornoORA_NCHAR_LITERAL_REPLACE
enTRUE
. También puede lograr este comportamiento mediante programación usando los modosOCI_NCHAR_LITERAL_REPLACE_ON
yOCI_NCHAR_LITERAL_REPLACE_OFF
enOCIEnvCreate()
yOCIEnvNlsCreate()
. Entonces, por ejemplo,OCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_ON)
activa el reemplazo literal deNCHAR
, mientras queOCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_OFF)
lo desactiva.[...] Tenga en cuenta que, cuando el reemplazo literal de
NCHAR
está activado,OCIStmtPrepare
yOCIStmtPrepare2
transformaránN''
literales conU''
literales en el texto SQL y almacenarán el texto SQL resultante en el identificador de la declaración . Por lo tanto, si la aplicación usaOCI_ATTR_STATEMENT
para recuperar el texto de SQL del identificador de la declaraciónOCI
, el texto de SQL devolveráU''
lugar deN''
como se especifica en el texto original .
(3) Responde a tu pregunta
Desde la perspectiva de los tipos de datos, no hay diferencia entre las dos consultas proporcionadas
N'' string ''
solo devuelve lastring
como tipoNCHAR
.U'' string ''
también devuelve el tipoNCHAR
, sin embargo, realiza un procesamiento adicional a lastring
: reemplaza//
con/
y/ xxxx
con el punto de código UnicodeU+ xxxx
, dondexxxx
son 4 dígitos hexadecimales. Esto es similar aUNISTR('' string '')
, la diferencia es que la última devuelveNVARCHAR2
.
U''
literales U''
son útiles cuando quieres tener una cadena Unicode independiente de la codificación y la configuración NLS.
Ejemplo:
select n''/€'', u''///20ac'', n''///20ac'' from dual;
N''/€'' U''///20AC'' N''///20AC''
----- ---------- ----------
/€ /€ ///20ac