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ù
N
oun
spécifie le littéral en utilisant le jeu de caractères national (NCHAR
ouNVARCHAR2
donné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_description
colonnepm.product_descriptions
tableau 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
CHAR
etNCHAR
les 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_REPLACE
TRUE
. Vous pouvez également obtenir ce comportement de manière programmatique en utilisant leOCI_NCHAR_LITERAL_REPLACE_ON
etOCI_NCHAR_LITERAL_REPLACE_OFF
modes deOCIEnvCreate()
etOCIEnvNlsCreate()
. Ainsi, par exemple,OCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_ON)
activeNCHAR
remplacement littéral, alors queOCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_OFF)
désactive.[...] Il est à noter que, lorsque l'
NCHAR
littérale de remplacement est activée,OCIStmtPrepare
etOCIStmtPrepare2
transformeraN'
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_STATEMENT
pour récupérer le texte SQL à partir duOCI
poigné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'
retournestring
NCHAR
type.U'string'
renvoie aussiNCHAR
tapez, cependant il fait un traitement supplémentaire à lastring
: il remplace\
\
et\xxxx
avec point de code UnicodeU+xxxx
, oùxxxx
4 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