Что означает префикс N в операторах T-SQL и когда я должен его использовать?


352

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

Я искал, но не смог понять, для чего это нужно, Nпрежде чем вставлять какие-либо строки в таблицу.

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

Какой цели служит этот префикс «N» и когда его следует использовать?

Ответы:


415

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

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

Цитировать из Microsoft :

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


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

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


1
@ Курт, это означает, что я должен использовать Nтолько тогда, когда я использую следующие типы данных CHAR, VARCHAR or TEXT?? поскольку `NCHAR, NVARCHAR или NTEXT` по своей природе хранят UNICODE, мне не требуется добавлять его отдельно ... правда ли это?
Притеш

@Pritesh - Только если вы используете кодовую страницу по умолчанию, которая может не распознавать эти символы Юникода, как указано жирным шрифтом выше.
Тодд

5
@Curt Соединения с databases aspfaq comпереадресациями на крайне сомнительные сайты ( fkref com, za1 zeroredirect1 com, i0z13 trackvoluum com), которые были отмечены нашей корпоративной сетью , как порнография, вредоносные сайты и спама - адреса. Я связался с владельцем aspfaq.com и отредактировал ответ, чтобы удалить ссылку.
Jaume

21

Позвольте мне рассказать вам досадную вещь, которая произошла с 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 не имеет большой точки , поэтому я думаю, что это не удается.


8

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 (например, международные символы - пример - А), то он потерпит неудачу или будет поврежден.


4

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.