Oracle
 sql >> Base de données >  >> RDS >> Oracle

Différence entre les littéraux N'String' et U'String' dans Oracle

Dans cette réponse, je vais essayer de fournir des informations provenant de ressources officielles

(1) Le littéral du texte N''

N'' est utilisé pour convertir une chaîne en NCHAR ou NVARCHAR2 type de données

Selon cette documentation Oracle Oracle - Littéraux

La syntaxe des littéraux de texte est la suivante :

N ou n spécifie le littéral en utilisant le jeu de caractères national (NCHAR ou NVARCHAR2 données).

Aussi dans ce deuxième article Oracle - Types de données

Le N'String' est utilisé pour convertir une chaîne en NCHAR type de données

Extrait de l'article ci-dessus :

L'exemple suivant compare le translated_description colonne du pm.product_descriptions table avec une chaîne de jeu de caractères nationaux :

SELECT translated_description FROM product_descriptions
  WHERE translated_name = N'LCD Monitor 11/PM';

(2) Le littéral U''

U'' est utilisé pour gérer les littéraux de chaîne SQL NCHAR dans Oracle Call Interface (OCI)

Basé sur cette documentation Oracle Programmation avec Unicode

L'interface d'appel d'Oracle (OCI) est l'API de niveau le plus bas utilisée par le reste des produits d'accès à la base de données côté client. Il fournit un moyen flexible pour les programmes C/C++ d'accéder aux données Unicode stockées dans SQL CHAR et NCHAR Types de données. À l'aide d'OCI, vous pouvez spécifier par programmation le jeu de caractères (UTF-8, UTF-16 et autres) pour les données à insérer ou à récupérer. Il accède à la base de données via Oracle Net.

OCI est l'API de niveau le plus bas pour accéder à une base de données, elle offre donc les meilleures performances possibles.

Gestion des littéraux de chaîne SQL NCHAR dans OCI

Vous pouvez l'activer en définissant la variable d'environnement ORA_NCHAR_LITERAL_REPLACE à TRUE . Vous pouvez également obtenir ce comportement par programmation en utilisant le OCI_NCHAR_LITERAL_REPLACE_ON et OCI_NCHAR_LITERAL_REPLACE_OFF modes dans OCIEnvCreate() et OCIEnvNlsCreate() . Ainsi, par exemple, OCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_ON) active NCHAR remplacement littéral, tandis que OCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_OFF) l'éteint.

[...] Notez que, lorsque le NCHAR le remplacement littéral est activé, OCIStmtPrepare et OCIStmtPrepare2 transformera N' littéraux avec U' littéraux dans le texte SQL et stocke le texte SQL résultant dans le descripteur d'instruction . Ainsi, si l'application utilise OCI_ATTR_STATEMENT pour récupérer le texte SQL de l'OCI handle d'instruction, le texte SQL renverra U' au lieu de N' comme spécifié dans le texte original .

(3) Réponse à votre question

Du point de vue des types de données, il n'y a pas de différence entre les deux requêtes fournies