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
Nonespecifica el literal utilizando el conjunto de caracteres nacional (datosNCHARoNVARCHAR2).
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_descriptionde la tablapm.product_descriptionscon 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
CHARyNCHARSQL. 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_REPLACEconfigurando la variable de entornoORA_NCHAR_LITERAL_REPLACEenTRUE. También puede lograr este comportamiento mediante programación usando los modosOCI_NCHAR_LITERAL_REPLACE_ONyOCI_NCHAR_LITERAL_REPLACE_OFFenOCIEnvCreate()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
NCHARestá activado,OCIStmtPrepareyOCIStmtPrepare2transformará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_STATEMENTpara 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 lastringcomo tipoNCHAR.U'' string ''también devuelve el tipoNCHAR, sin embargo, realiza un procesamiento adicional a lastring: reemplaza//con/y/ xxxxcon el punto de código UnicodeU+ xxxx, dondexxxxson 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