Jakie jest znaczenie przedrostka N w wyrażeniach T-SQL i kiedy należy go używać?

Widziałem prefiks N w niektórych zapytaniach insert T-SQL. Wiele osób używało N przed wstawieniem wartości do tabeli.

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

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

Do jakiego celu służy ten przedrostek "N" i kiedy powinien być używany?

Author: Cody Gray, 2012-04-05

4 answers

Deklaruje łańcuch jako typ danych nvarchar, a nie varchar

Być może widziałeś Kod Transact-SQL, który przekazuje ciągi za pomocą przedrostek N. Oznacza to, że kolejny ciąg znaków jest w Unicode (w rzeczywistości N oznacza zestaw znaków języka narodowego). Które oznacza, że przekazujesz wartość NCHAR, NVARCHAR lub ntext, jako w przeciwieństwie do CHAR, VARCHAR lub TEXT.

Cytuję z Microsoftu :

Prefiks znak Unicode ciąg stałych z literą N. bez przedrostek N, ciąg jest konwertowany na domyślną stronę kodową baza 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, zobacz ten post:

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

 447
Author: Curt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:45

Powiem ci coś irytującego, co stało się z prefiksem N' - nie byłem w stanie tego naprawić przez dwa dni.

Moja baza danych to SQL_Latin1_General_CP1_CI_AS .

Posiada tabelę z kolumną o nazwie MyCol1 . Jest to Nvarchar

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

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

// 0 result

Using prefix N " fixes it

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

// 1 result - found!!!!
Dlaczego? Bo latin1_general nie ma dużego i dlatego chyba nie.
 25
Author: bh_earth0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-20 19:49:22

1. Wydajność:

Załóżmy, że klauzula where jest następująca:

WHERE NAME='JON'

Jeśli kolumna NAME jest innego typu niż nvarchar lub nchar, to nie należy podawać przedrostka N. Jeśli jednak kolumna NAME jest typu nvarchar lub nchar, to jeśli nie podasz przedrostka N, to 'JON' jest traktowany jako non-unicode. Oznacza to, że typ danych kolumny NAME i łańcucha "JON" są różne i dlatego SQL Server domyślnie konwertuje jeden typ operandu na drugi. Jeśli SQL Serwer konwertuje Typ dosłownika do typu kolumny wtedy nie ma problemu, ale jeśli zrobi to w inny sposób, to wydajność będzie boleć, ponieważ indeks kolumny (jeśli jest dostępny) nie będzie używany.

2. Zestaw znaków:

Jeżeli kolumna jest typu nvarchar lub nchar, to Zawsze używaj przedrostka N podczas określania ciągu znaków w klauzuli WHERE criteria/UPDATE / INSERT. Jeśli tego nie zrobisz, a jednym ze znaków w Twoim łańcuchu jest unicode (np. znaki-przykład-ā) wtedy zawiedzie lub poniesie uszkodzenie danych.

 10
Author: variable,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-09 09:19:29

Zakładając, że wartość jest typu nvarchar tylko dla tego, że używamy N "

 4
Author: RickyRam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-19 11:31:31