web-dev-qa-db-fra.com

Différence entre les littéraux 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;
19
Ganesh

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

(1) Le texte N '' littéral

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:

enter image description here

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

É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 table pm.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';

(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 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 et NCHAR. À 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 Sur TRUE. Vous pouvez également obtenir ce comportement par programme en utilisant les modes OCI_NCHAR_LITERAL_REPLACE_ON Et OCI_NCHAR_LITERAL_REPLACE_OFF Dans OCIEnvCreate() et OCIEnvNlsCreate(). Ainsi, par exemple, OCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_ON) active le remplacement littéral de NCHAR, tandis que OCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_OFF) le désactive.

[...] Notez que, lorsque le remplacement littéral NCHAR est activé, OCIStmtPrepare et OCIStmtPrepare2transformeront les littéraux N' Avec U' Littéraux dans le texte SQL et stockez le texte SQL résultant dans le handle d'instruction. Ainsi, si l'application utilise OCI_ATTR_STATEMENT Pour récupérer le texte SQL à partir du handle d'instruction OCI, le texte SQL renverra U' Au lieu de N' comme spécifié dans le texte original.


(3) Répondez à 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

13
Hadi
  • 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
5
mik

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

5
apomene