Яке значення префікса 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 рядок перетворюється на кодову сторінку бази даних за замовчуванням. Ця сторінка коду за замовчуванням може не розпізнавати певні символи .


Якщо ви хочете знати різницю між цими двома типами даних, перегляньте цю публікацію "ТА":

Яка різниця між варчаром і нварчаром?


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

@Pritesh - Тільки якщо ви використовуєте кодову сторінку за замовчуванням, яка може не розпізнавати ці символи unicode, як у напівжирному тексті вище.
Тодд

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 NAME='JON'

Якщо стовпець NAME має будь-який тип, окрім nvarchar або nchar, не слід вказувати N префікса. Однак якщо стовпець NAME має тип nvarchar або nchar, то якщо ви не вказали префікс N, тоді 'JON' трактується як unicode. Це означає, що тип даних стовпця 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.