Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Unterschied zwischen N'String'- und U'String'-Literalen in Oracle

In dieser Antwort werde ich versuchen, Informationen aus offiziellen Quellen bereitzustellen

(1) Das N''-Textliteral

N'' wird verwendet, um einen String in NCHAR umzuwandeln oder NVARCHAR2 Datentyp

Laut dieser Oracle-Dokumentation Oracle - Literals

Die Syntax von Textliteralen lautet wie folgt:

wobei N oder n spezifiziert das Literal mit dem nationalen Zeichensatz (NCHAR oder NVARCHAR2 Daten).

Auch in diesem zweiten Artikel Oracle - Datentypen

Der N'String' wird verwendet, um einen String in NCHAR umzuwandeln Datentyp

Aus dem oben aufgeführten Artikel:

Das folgende Beispiel vergleicht die translated_description Spalte der pm.product_descriptions Tabelle mit einem nationalen Zeichensatz :

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

(2) Das U''-Literal

U'' wird verwendet, um die SQL-NCHAR-String-Literale in Oracle Call Interface (OCI) zu verarbeiten

Basierend auf dieser Oracle-Dokumentation Programmieren mit Unicode

Die Oracle-Anrufschnittstelle (OCI) ist die API auf unterster Ebene, die von den übrigen Produkten für den clientseitigen Datenbankzugriff verwendet wird. Es bietet C/C++-Programmen eine flexible Möglichkeit, auf Unicode-Daten zuzugreifen, die in SQL CHAR gespeichert sind und NCHAR Datentypen. Mit OCI können Sie den Zeichensatz (UTF-8, UTF-16 und andere) für die einzufügenden oder abzurufenden Daten programmgesteuert angeben. Es greift über Oracle Net auf die Datenbank zu.

OCI ist die niedrigste API für den Zugriff auf eine Datenbank und bietet daher die bestmögliche Leistung.

Verarbeitung von SQL-NCHAR-String-Literalen in OCI

Sie können es einschalten, indem Sie die Umgebungsvariable ORA_NCHAR_LITERAL_REPLACE setzen auf TRUE . Sie können dieses Verhalten auch programmgesteuert erreichen, indem Sie OCI_NCHAR_LITERAL_REPLACE_ON verwenden und OCI_NCHAR_LITERAL_REPLACE_OFF Modi in OCIEnvCreate() und OCIEnvNlsCreate() . Also zum Beispiel OCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_ON) schaltet NCHAR ein wörtliche Ersetzung, während OCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_OFF) schaltet es aus.

[...] Beachten Sie, dass bei NCHAR wörtliche Ersetzung ist aktiviert, OCIStmtPrepare und OCIStmtPrepare2 wandelt N' um Literale mit U' Literale im SQL-Text und speichern den resultierenden SQL-Text im Statement-Handle . Wenn also die Anwendung OCI_ATTR_STATEMENT verwendet um den SQL-Text aus dem OCI abzurufen Anweisungshandle, gibt der SQL-Text U' zurück statt N' wie im Originaltext angegeben .

(3) Antwort auf Ihre Frage

Aus Sicht der Datentypen gibt es keinen Unterschied zwischen den beiden bereitgestellten Abfragen