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

Diferencia entre los literales N'String' y U'String' en Oracle

En esta respuesta intentaré proporcionar información de fuentes oficiales

(1) El texto N'' Literal

N'' se utiliza para convertir una cadena a NCHAR o NVARCHAR2 tipo de datos

Según esta documentación de Oracle Oracle - Literales

La sintaxis de los literales de texto es la siguiente:

donde N o n especifica el literal usando el juego de caracteres nacional (NCHAR o NVARCHAR2 datos).

También en este segundo artículo Oracle - Tipos de datos

La N'String' se utiliza para convertir una cadena a NCHAR tipo de datos

Del artículo mencionado anteriormente:

El siguiente ejemplo compara la translated_description columna de pm.product_descriptions tabla con una cadena de caracteres nacionales :

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 SQL NCHAR en Oracle Call Interface (OCI)

Basado en esta documentación de Oracle Programación con Unicode

La interfaz de llamadas de Oracle (OCI) es la API de nivel más bajo que utilizan el resto de los productos de acceso a la base de datos del lado del cliente. Proporciona una forma flexible para que los programas C/C++ accedan a los datos Unicode almacenados en SQL CHAR y NCHAR tipos de datos. Con OCI, puede especificar mediante programación el juego 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 literales de cadena SQL NCHAR en OCI

Puede activarlo configurando la variable de entorno ORA_NCHAR_LITERAL_REPLACE a TRUE . También puede lograr este comportamiento mediante programación usando OCI_NCHAR_LITERAL_REPLACE_ON y OCI_NCHAR_LITERAL_REPLACE_OFF modos en OCIEnvCreate() y OCIEnvNlsCreate() . Entonces, por ejemplo, OCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_ON) activa NCHAR reemplazo literal, mientras que OCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_OFF) lo apaga.

[...] Tenga en cuenta que, cuando el NCHAR el reemplazo literal está activado, OCIStmtPrepare y OCIStmtPrepare2 transformará N' literales con U' literales en el texto SQL y almacenar el texto SQL resultante en el identificador de declaración . Por lo tanto, si la aplicación usa OCI_ATTR_STATEMENT para recuperar el texto SQL del OCI identificador de declaración, el texto SQL devolverá U' en lugar de N' como se especifica en el texto original .

(3) Respuesta a su pregunta

Desde la perspectiva de los tipos de datos, no hay diferencia entre ambas consultas proporcionadas