Jakie jest znaczenie przedrostka N w instrukcjach T-SQL i kiedy powinienem go używać?

352

Widziałem przedrostek N w niektórych zapytaniach wstawiających T-SQL. Wiele osób używało Nprzed wstawieniem wartości do tabeli.

Szukałem, ale nie byłem w stanie zrozumieć, jaki jest cel włączenia Nprzed wstawieniem ciągów do tabeli.

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

W jakim celu służy ten prefiks „N” i kiedy należy go używać?

Kartik Patel
źródło

Odpowiedzi:

415

Deklaruje ciąg jako nvarchartyp danych, a nievarchar

Być może widziałeś kod Transact-SQL, który przekazuje ciągi znaków za pomocą prefiksu N. 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.

Cytat z Microsoft :

Prefiks Stałe ciągi znaków Unicode z literą N. Bez prefiksu N ciąg jest konwertowany na domyślną stronę kodową bazy danych. Ta domyślna strona kodowa może nie rozpoznawać niektórych znaków .


Jeśli chcesz poznać różnicę między tymi dwoma typami danych, zapoznaj się z tym postem SO:

Jaka jest różnica między varchar a nvarchar?

Lakoniczny
źródło
1
@Curt, co oznacza, że ​​powinienem używać Ntylko wtedy, gdy używam następujących typów danych CHAR, VARCHAR or TEXT? ponieważ `NCHAR, NVARCHAR lub NTEXT` z natury przechowują kod UNICODE, nie muszę go dodawać osobno ... czy to prawda?
Pritesh
@Pritesh - Tylko jeśli używasz domyślnej strony kodowej, która może nie rozpoznawać znaków Unicode, jak w pogrubionym tekście powyżej.
Todd
5
@Curt link do databases aspfaq comprzekierowuje do bardzo wątpliwych witryn ( fkref com, za1 zeroredirect1 com, i0z13 trackvoluum com), które zostały oznaczone przez naszą korporacyjną zaporę jak pornografia, złośliwych witryn i adresów URL spamu. Skontaktowałem się z właścicielem aspfaq.com i zredagowałem odpowiedź, aby usunąć link.
jaume
21

Pozwól, że powiem ci irytującą rzecz, która wydarzyła się z N'przedrostkiem - nie byłem w stanie tego naprawić przez dwa dni.

Moje zestawienie bazy danych to SQL_Latin1_General_CP1_CI_AS .

Ma tabelę z kolumną o nazwie MyCol1 . To jest Nvarchar

To zapytanie nie odpowiada dokładnej wartości, która istnieje.

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

// 0 result

użycie przedrostka N '' naprawia to

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

// 1 result - found!!!!

Dlaczego? Ponieważ latin1_general nie ma dużych kropek, to chyba dlatego się nie udaje.

bh_earth0
źródło
8

1. Wydajność:

Załóżmy, że klauzula where jest taka:

WHERE NAME='JON'

Jeśli kolumna NAME jest innego typu niż nvarchar lub nchar, nie należy określać prefiksu N. Jeśli jednak kolumna NAME jest typu nvarchar lub nchar, to jeśli nie określisz prefiksu N, wówczas „JON” jest traktowany jako inny niż Unicode. Oznacza to, że typ danych kolumny NAME i łańcucha „JON” są różne, a zatem SQL Server domyślnie konwertuje typ jednego operandu na drugi. Jeśli SQL Server konwertuje typ literału na typ kolumny, nie ma problemu, ale jeśli zrobi to w drugą stronę, wydajność spadnie, ponieważ indeks kolumny (jeśli jest dostępny) nie będzie używany.

2. Zestaw znaków:

Jeśli kolumna jest typu nvarchar lub nchar, zawsze używaj przedrostka N, określając ciąg znaków w klauzuli WHERE kryteria / UPDATE / INSERT. Jeśli tego nie zrobisz, a jeden ze znaków w łańcuchu będzie Unicode (np. Znaki międzynarodowe - przykład - ā), to nie powiedzie się lub nastąpi uszkodzenie danych.

zmienna
źródło
4

Zakładając, że wartością jest typ nvarchar, ponieważ tylko my używamy N ''

RickyRam
źródło