Quelle est la signification et la différence entre ces requêtes?
SELECT U'String' FROM dual;
et
SELECT N'String' FROM dual;
Dans cette réponse, je vais essayer de fournir des informations à partir des ressources officielles
N''
Est utilisé pour convertir une chaîne en type de données NCHAR
ou NVARCHAR2
Selon cette documentation Oracle Oracle - Literals
La syntaxe des littéraux de texte est la suivante:
où
N
oun
spécifie le littéral en utilisant le jeu de caractères national (donnéesNCHAR
ouNVARCHAR2
).
Également dans ce deuxième article Oracle - Datatypes
Le N'String'
Est utilisé pour convertir une chaîne en type de données NCHAR
De l'article ci-dessus:
L'exemple suivant compare la colonne
translated_description
De la tablepm.product_descriptions
Avec une chaîne de jeu de caractères nationale:SELECT translated_description FROM product_descriptions WHERE translated_name = N'LCD Monitor 11/PM';
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 Oracle (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 offre un moyen flexible aux programmes C/C++ d'accéder aux données Unicode stockées dans les types de données SQL
CHAR
etNCHAR
. À l'aide d'OCI, vous pouvez spécifier par programme 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
SurTRUE
. Vous pouvez également obtenir ce comportement par programme en utilisant les modesOCI_NCHAR_LITERAL_REPLACE_ON
EtOCI_NCHAR_LITERAL_REPLACE_OFF
DansOCIEnvCreate()
etOCIEnvNlsCreate()
. Ainsi, par exemple,OCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_ON)
active le remplacement littéral deNCHAR
, tandis queOCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_OFF)
le désactive.[...] Notez que, lorsque le remplacement littéral
NCHAR
est activé,OCIStmtPrepare
etOCIStmtPrepare2
transformeront les littérauxN'
AvecU'
Littéraux dans le texte SQL et stockez le texte SQL résultant dans le handle d'instruction. Ainsi, si l'application utiliseOCI_ATTR_STATEMENT
Pour récupérer le texte SQL à partir du handle d'instructionOCI
, le texte SQL renverraU'
Au lieu deN'
comme spécifié dans le texte original.
Du point de vue des types de données, il n'y a pas de différence entre les deux requêtes fournies
N'string'
Renvoie simplement le string
En tant que type NCHAR
.
U'string'
Renvoie également le type NCHAR
, mais il effectue un traitement supplémentaire au string
: Il remplace \\
Par \
Et \xxxx
avec le point de code Unicode U+xxxx
, où xxxx
est composé de 4 chiffres hexadécimaux. Ceci est similaire à UNISTR('string')
, la différence est que ce dernier retourne NVARCHAR2
.
Les littéraux U'
Sont utiles lorsque vous souhaitez avoir une chaîne Unicode indépendante du codage et des paramètres NLS.
Exemple:
select n'\€', u'\\\20ac', n'\\\20ac' from dual;
N'\€' U'\\\20AC' N'\\\20AC'
----- ---------- ----------
\€ \€ \\\20ac
lors de l'utilisation de N'
nous notons que le type de données donné est NCHAR
ou NVARCHAR
.
U'
est utilisé pour désigner unicode