Différence entre les littérales N'String et U'string dans Oracle
Quelle est la signification et la différence entre ces requêtes?
SELECT U'String' FROM dual;
et
SELECT N'String' FROM dual;
3 réponses
Dans cette réponse, je vais essayer de fournir des informations à partir de sources officielles
(1) Le N" texte Littéral
N'' est utilisé pour convertir une chaîne de caractères NCHAR ou NVARCHAR2 type de données
selon cette documentation Oracle Oracle-Littérals
La syntaxe de littéraux de texte est comme suit:
où
Nounspécifie le littéral en utilisant le jeu de caractères national (NCHARouNVARCHAR2données).
aussi dans ce second article Oracle-Types De Données
N'String' est utilisé pour convertir une chaîne de caractères NCHAR type de données
à Partir de l'article ci-dessus:
L'exemple suivant compare l'
translated_descriptioncolonnepm.product_descriptionstableau nationale jeu de caractères chaîne de caractères:SELECT translated_description FROM product_descriptions WHERE translated_name = N'LCD Monitor 11/PM';
(2) L'U" Littérale
U'' est utilisé pour gérer la chaîne de caractères SQL NCHAR dans Oracle Call Interface (OCI)
basé sur cette documentation Oracle programmation avec Unicode
The Oracle Call Interface (OCI) est l'API de niveau le plus bas que le reste des produits d'accès à la base de données côté client utilisent. Il fournit une manière flexible pour les programmes C / C++ d'accéder aux données Unicode stockées dans SQL
CHARetNCHARles types de données. En utilisant OCI, vous pouvez programmatiquement spécifier le jeu de caractères (UTF-8, UTF-16, et autres) pour que les données soient insérées ou extraites. Il accède à la base de données via Oracle Net.
OCI est L'API la plus basse pour accéder à une base de données, elle offre donc la meilleure performance possible.
Gestion SQL NCHAR Les Littéraux de chaîne dans le BEC
vous pouvez l'activer en paramétrant la variable d'environnement
ORA_NCHAR_LITERAL_REPLACETRUE. Vous pouvez également obtenir ce comportement de manière programmatique en utilisant leOCI_NCHAR_LITERAL_REPLACE_ONetOCI_NCHAR_LITERAL_REPLACE_OFFmodes deOCIEnvCreate()etOCIEnvNlsCreate(). Ainsi, par exemple,OCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_ON)activeNCHARremplacement littéral, alors queOCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_OFF)désactive.[...] Il est à noter que, lorsque l'
NCHARlittérale de remplacement est activée,OCIStmtPrepareetOCIStmtPrepare2transformeraN'les littérauxU'littérales dans le texte SQL et stocker le texte SQL résultant dans la poignée de déclaration. Ainsi, si l'application utiliseOCI_ATTR_STATEMENTpour récupérer le texte SQL à partir duOCIpoignée de déclaration, le texte SQL retourneraU'au lieu deN'comme spécifié dans le texte original.
(3) la 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 fourni
lors de l'utilisation de N' nous indiquons que le type de données donné est NCHAR ou NVARCHAR.
U' est utilisé pour désigner unicode
N'string'retournestringNCHARtype.U'string'renvoie aussiNCHARtapez, cependant il fait un traitement supplémentaire à lastring: il remplace\\et\xxxxavec point de code UnicodeU+xxxx, oùxxxx4 chiffres hexadécimaux. Ceci est similaire àUNISTR('string'), la différence est que celle-ci retourneNVARCHAR2.
U' les littérales sont utiles quand vous voulez avoir une chaîne de caractères Unicode indépendante de l'encodage et des paramètres NLS.
Exemple:
select n'\€', u'\ac', n'\ac' from dual;
N'\€' U'\AC' N'\AC'
----- ---------- ----------
\€ \€ \ac
