Was bedeutet das Präfix N in T-SQL-Anweisungen und wann sollte ich es verwenden?


352

Ich habe Präfix N in einigen T-SQL-Abfragen zum Einfügen gesehen. Viele Leute haben benutztN vor dem Einfügen des Wertes in eine Tabelle verwendet.

Ich habe gesucht, aber ich konnte nicht verstehen, wozu das NEinfügen von Zeichenfolgen in die Tabelle dient.

INSERT INTO Personnel.Employees
VALUES(N'29730', N'Philippe', N'Horsford', 20.05, 1),

Welchen Zweck erfüllt dieses 'N'-Präfix und wann sollte es verwendet werden?

Antworten:


415

Es deklariert die Zeichenfolge als nvarcharDatentyp und nicht als Datentypvarchar

Möglicherweise haben Sie Transact-SQL-Code gesehen, der Zeichenfolgen mit einem N-Präfix weitergibt. Dies bedeutet, dass sich die nachfolgende Zeichenfolge in Unicode befindet (das N steht tatsächlich für den Zeichensatz der Landessprache). Dies bedeutet, dass Sie im Gegensatz zu CHAR, VARCHAR oder TEXT einen NCHAR-, NVARCHAR- oder NTEXT-Wert übergeben.

Um von Microsoft zu zitieren :

Präfix Unicode-Zeichenfolgenkonstanten mit dem Buchstaben N. Ohne das Präfix N wird die Zeichenfolge in die Standardcodepage der Datenbank konvertiert. Diese Standardcodepage erkennt möglicherweise bestimmte Zeichen nicht .


Wenn Sie den Unterschied zwischen diesen beiden Datentypen kennen möchten, lesen Sie diesen SO-Beitrag:

Was ist der Unterschied zwischen varchar und nvarchar?


1
@Curt das heißt, ich sollte Nnur verwenden, wenn ich folgende Datentypen verwende CHAR, VARCHAR or TEXT? Da `NCHAR, NVARCHAR oder NTEXT` von Natur aus UNICODE speichern, muss ich es nicht separat hinzufügen ... stimmt das?
Pritesh

@Pritesh - Nur wenn Sie eine Standardcodepage verwenden, die diese Unicode-Zeichen möglicherweise nicht wie oben in Fettdruck erkennt.
Todd

5
@Curt der Link zu databases aspfaq comUmleitungen auf äußerst fragwürdige Websites ( fkref com, za1 zeroredirect1 com, i0z13 trackvoluum com), die von unserem Unternehmens - Firewall als Pornographie, bösartige Websites und Spam - URLs markiert wurde. Ich habe den Besitzer von aspfaq.com kontaktiert und die Antwort bearbeitet, um den Link zu entfernen.
Jaume

21

Lassen Sie mich Ihnen eine nervige Sache erzählen, die mit dem passiert ist N' Präfix ist - ich konnte es zwei Tage lang nicht reparieren.

Meine Datenbanksortierung lautet SQL_Latin1_General_CP1_CI_AS .

Es hat eine Tabelle mit einer Spalte namens MyCol1 . Es ist ein Nvarchar

Diese Abfrage stimmt nicht mit dem vorhandenen exakten Wert überein .

SELECT TOP 1 * FROM myTable1 WHERE  MyCol1 = 'ESKİ'  

// 0 result

mit Präfix N '' wird das Problem behoben

SELECT TOP 1 * FROM myTable1 WHERE  MyCol1 = N'ESKİ'  

// 1 result - found!!!!

Warum? Weil latin1_general keine großen Punkte hat , deshalb scheitert es vermutlich.


8

1. Leistung:

Angenommen, Ihre where-Klausel lautet wie folgt:

WHERE NAME='JON'

Wenn die NAME-Spalte von einem anderen Typ als nvarchar oder nchar ist, sollten Sie das N-Präfix nicht angeben. Wenn die NAME-Spalte jedoch vom Typ nvarchar oder nchar ist und Sie das N-Präfix nicht angeben, wird 'JON' als Nicht-Unicode behandelt. Dies bedeutet, dass der Datentyp der NAME-Spalte und die Zeichenfolge 'JON' unterschiedlich sind und SQL Server den Typ eines Operanden implizit in den anderen konvertiert. Wenn der SQL Server den Literaltyp in den Spaltentyp konvertiert, gibt es kein Problem. Wenn dies jedoch andersherum erfolgt, wird die Leistung beeinträchtigt, da der Spaltenindex (falls verfügbar) nicht verwendet wird.

2. Zeichensatz:

Wenn die Spalte vom Typ nvarchar oder nchar ist, verwenden Sie immer das Präfix N, während Sie die Zeichenfolge in der WHERE-Kriterien / UPDATE / INSERT-Klausel angeben. Wenn Sie dies nicht tun und eines der Zeichen in Ihrer Zeichenfolge Unicode ist (wie internationale Zeichen - Beispiel - ā), schlägt es fehl oder es kommt zu einer Beschädigung der Daten.


4

Angenommen, der Wert ist vom Typ nvarchar, nur verwenden wir N ''

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.