SQL server-Abfrage: Was ist die Bedeutung von 'N' vor einem String?

In SQL server die Abfrage

SELECT custid, country, region, city FROM Sales.Customers WHERE region = N'WA' 

was ist die Bedeutung von 'N' in der Wo-Klausel? Ich entferne es, bekomme das gleiche Ergebnis.

Unicode-String-Konstanten, die im auf dem server ausgeführten Code erscheinen, z. B. in gespeicherten Prozeduren und Triggern, muss dem Großbuchstaben N vorangestellt werden. Dies gilt auch dann, wenn die Spalte, auf die verwiesen wird, bereits als Unicode definiert ist. Ohne das N Präfix wird die characterfolge in die Standard-Codepage der database konvertiert. Dies kann bestimmte character nicht erkennen.

Beispielsweise kann die im vorherigen Beispiel erstellte gespeicherte Prozedur auf dem server wie folgt ausgeführt werden:

 EXECUTE Product_Info @name = N'Chain' 

Die Anforderung, das N Präfix zu verwenden, gilt für beide Streichkonstanten, die auf dem server und den vom Client gesendeten auftreten.

Es wirft dein Literal auf einen Unicode-String.

Siehe hier zur offiziellen Erklärung:

Unicode-Strings haben ein Format, das characterfolgen ähnelt, aber ein N-Bezeichner vorausgeht (N steht für National Language im SQL-92-Standard).

In vielen Fällen wird es keinen Unterschied machen, es sei denn, Ihr Literal enthält Unicode-character. Wenn es tut, und Sie verlassen die explizite Besetzung, wird es Ihre Unicode-character in ein '?' Konvertieren:

 select 'Ộ', N'Ộ' ---- ---- ? Ộ 

'N' steht für National Language und bedeutet, dass Sie einen Wert für NVARCHAR , NCHAR übergeben . Die datatypen, die andere Sprachen als Englisch akzeptieren, beginnen mit N.

Denken Sie daran, dass Sie nicht verpflichtet sind, Ihren Parameter mit 'N' für datatypen wie VARCHAR , CHAR zu umwickeln, da sie keine Unicode-character akzeptieren.

Jede andere Sprache wie Arabisch, Farsi wird als Unicode betrachtet, so dass sie in datatypen wie NVARCHAR manipuliert werden sollten und Werte mit 'N' wie folgt verpackt werden sollten:

 DECLARE @Name AS NVARCHAR(50); SET @Name = N'اسم'; PRINT @Name; 

Dies wird zurückkehren:

 اسم 

Wenn du ohne 'N' versuchst:

 DECLARE @Name AS NVARCHAR(50); SET @Name = 'اسم'; PRINT @Name; 

Das wird zurückkehren

 ??? 

Es ist, weil du den Wert nicht mit 'N' verpackt hast, obwohl der datatyp NVARCHAR ist und das System nichts über das Wort 'اسم' weiß.