N prefiks przed ciągiem w zapytaniu Transact-SQL

41

Czy mógłbyś mi powiedzieć, kiedy powinienem użyć przedrostka N przed ciągiem w zapytaniu Transact-SQL? Zacząłem pracować z bazą danych, w której nie otrzymuję żadnych wyników przy użyciu takich zapytań

SELECT * FROM a_table WHERE a_field LIKE '%а_pattern%'

dopóki nie zmienię wzoru na N'%а_pattern%'. Nigdy wcześniej nie musiałem dodawać tego prefiksu, więc jestem ciekawy. a_fieldjest zdefiniowane jako nvarchar(255), ale myślę, że powodem jest coś innego.

Alexander Prokofyev
źródło

Odpowiedzi:

31

Poniższe artykuły zawierają dobre informacje na ten temat. Krótka odpowiedź jest taka, że ​​istnieje niezgodność typu między kolumną Unicode a literałem ciągów znaków innego niż Unicode, którego używasz. Z artykułu KB wygląda na to, że pominięcie prefiksu N może nadal działać w niektórych przypadkach, ale będzie to zależeć od strony kodowej i ustawień sortowania bazy danych. To może wyjaśniać zmianę zachowania, jeśli wcześniej osiągałeś sukces dzięki metodzie bez prefiksu.

https://support.microsoft.com/en-us/kb/239530

Charlie
źródło
6

Oznacza to, że kolejny ciąg znaków jest w Unicode (N w rzeczywistości oznacza zestaw znaków języka narodowego). Co oznacza, że ​​przekazujesz wartość NCHAR, NVARCHAR lub NTEXT, w przeciwieństwie do CHAR, VARCHAR lub TEXT. Porównanie tych typów danych znajduje się w artykule # 2354.

Unicode jest zwykle używany w aplikacjach bazodanowych zaprojektowanych w celu ułatwienia stron kodowych, które wykraczają poza strony kodowe w języku angielskim i Europie Zachodniej, na przykład chiński. Unicode został zaprojektowany tak, aby rozszerzone zestawy znaków mogły nadal „pasować” do kolumn bazy danych.


źródło
3

Myślę, że przedrostek N mówi serwerowi SQL, aby traktował ciąg jako wartość Unicode. Kolumny nvarchar są Unicode, dlatego należy korzystać z tej składni podczas uzyskiwania dostępu do tych kolumn.

Rune Grimstad
źródło