В чем смысл префикса N в операторах T-SQL?

Я видел префикс N в некоторых запросах вставки T-SQL. Многие люди использовали N, прежде чем вставлять значение в таблицу.

Я искал, но я не смог понять, в чем цель включить N перед вставкой любых строк в таблицу.

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

Ответ 1

Он объявляет строку как тип данных nvarchar, а не varchar

Возможно, вы видели код Transact-SQL, который передает строки вокруг префикс N. Это означает, что последующая строка находится в Unicode (N фактически означает набор символов на национальном языке). Который означает, что вы передаете значение NCHAR, NVARCHAR или NTEXT, так как против CHAR, VARCHAR или TEXT.

Чтобы процитировать от Microsoft:

Префикс Unicode символьные строковые константы с буквой N. Без префикс N, строка преобразуется в кодовую страницу по умолчанию база данных. Эта кодовая страница по умолчанию может не распознавать определенные символы.


Если вы хотите узнать разницу между этими двумя типами данных, см. это сообщение SO:

В чем разница между varchar и nvarchar?

Ответ 2

Позвольте мне рассказать вам досадную вещь, которая произошла с префиксом N' - я не мог исправить это в течение двух дней.

Моя сортировка базы данных - SQL_Latin1_General_CP1_CI_AS.

В ней есть таблица со столбцом MyCol1. Это нварчар

Этот запрос не соответствует точному значению, которое существует.

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

// 0 result

использование префикса N '' исправляет это

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

// 1 result - found!!!!

Зачем? Потому что у latin1_general нет большой точки, поэтому я полагаю, что это не удалось.

Ответ 3

Предполагая, что значение имеет тип nvarchar, только мы используем N ''

Ответ 4

1. Производительность:

Предположим, ваше предложение where выглядит следующим образом:

WHERE NAME='JON'

Если столбец NAME относится к какому-либо типу, кроме nvarchar или nchar, не следует указывать префикс N. Однако, если столбец NAME имеет тип nvarchar или nchar, то, если вы не укажете префикс N, то JON будет считаться не-юникодом. Это означает, что тип данных столбца NAME и строки "JON" различаются, и поэтому SQL Server неявно преобразует один тип операндов в другой. Если SQL Server преобразует тип литералов в тип столбцов, проблем не возникает, но если это происходит иначе, производительность будет снижена, поскольку индекс столбца (если он доступен) не будет использоваться.

2. Набор символов:

Если столбец имеет тип nvarchar или nchar, всегда используйте префикс N при указании символьной строки в условии WHERE критериев /UPDATE/INSERT. Если вы этого не сделаете, и один из символов в вашей строке будет Unicode (например, международные символы - пример - А), то он потерпит неудачу или будет поврежден.