Почему нам нужно поставить N перед строками в Microsoft SQL Server?

34

Я изучаю T-SQL. Из примеров, которые я видел, чтобы вставить текст в varchar()ячейку, я могу написать только строку для вставки, но для nvarchar()ячеек в каждом примере строки начинаются с буквы N.

Я пробовал следующий запрос к таблице, в которой есть nvarchar()строки, и она отлично работает, поэтому префикс N не требуется:

insert into [TableName] values ('Hello', 'World')

Почему строки имеют префикс N во всех примерах, которые я видел?

Каковы плюсы или минусы использования этого префикса?

qinking126
источник
Разве N не нужен только для буквенных строк?
Уэйн Ин Як
Польский язык не на латыни ????
Heckflosse_230
2
Nозначает Национальный, как в «Национальных переменных символах», см. Эквивалентные типы данных ANSI SQL .
ErikE
Я согласен с этим вопросом, и никто еще не ответил на него, AFAICT. Может быть, это можно было бы переформулировать как «почему плохо позволять SQL неявно преобразовывать my VARCHARв NVARCHARмой строковый литерал ASCII?».
binki
Этот вопрос уже задавался и отвечал здесь: в чем разница между varchar и nvarchar?

Ответы:

27

NVarchar используется для Unicode. Если ваша база данных не хранит многоязычные данные, вы можете использовать Varchar. В качестве примера: N'abc'просто преобразует вашу строку в Unicode.

Питер Б
источник
2
Почему бы вам не использовать префикс U вместо N?
Аттила Кун
Вы могли бы быть перепутаны для неподписанного как предположение
JB King
U&'abc'правильный способ указать строки Unicode. Смотрите SQL 2003 BNF
выходной
2
Буква N фактически означает набор символов национального языка.
Майк Бовенландер
23

По умолчанию SQL-сервер использует коды символов Windows-1252 для varchar . Он содержит большинство символов для латинских языков (английский, немецкий, французский и т. Д.), Но не содержит символов для нелатинских языков (польский, русский и т. Д.). Как утверждает @Pieter B, nvarchar используется для решения этой проблемы, поскольку он предназначен для Unicode, который содержит эти недостающие символы. Это обходится дорого, для хранения nvarchar требуется вдвое больше места, чем для varchar.

Помещение N перед строкой гарантирует, что символы будут преобразованы в Unicode перед помещением в столбец nvarchar. Большую часть времени вы будете в порядке, оставив N выключенным, но я бы не рекомендовал это. Гораздо лучше быть в безопасности, чем потом сожалеть.

bwalk2895
источник
3
Просто пояснение: «По умолчанию» SQL-сервер использует кодировку, соответствующую сопоставлению поля Varchar, которое можно переопределить во время создания поля, как правило, основанное на сопоставлении по умолчанию для вашего экземпляра. Параметры сортировки по умолчанию для вашего экземпляра могут быть установлены во время установки, но обычно они соответствуют системному стандартному языку CP_ACP. Это будет Windows 1252 на американско-американском компьютере, но 932 на машине с японским языком системы, 1251 на русском и т. Д. Мораль этой истории? Используйте NVarchar :)
JasonTrue
1
Пока это единственный ответ, который отвечает на вопрос «зачем использовать префикс N в строковых строках, поскольку SQL будет неявно транскодировать?». Все остальные ответы на другой вопрос "В чем разница между nvarchar и varchar?"
Тимбо
18

Потому что MS SQL Server имеет слабую поддержку UTF-8 по сравнению с другими RDBMS.

MS SQL Server следует соглашению, используемому в самой Windows, что «узкие» строки ( charв C ++ CHARили VARCHARв SQL) кодируются в устаревшей «кодовой странице». Проблема с кодовыми страницами заключается в том, что они имеют ограниченное количество символов (большинство из них являются однобайтовыми кодировками, которые ограничивают репортуар до 256 символов) и разработаны для одного языка (или группы языков с похожими алфавитами). Это затрудняет хранение многоязычных данных. Например, вы не можете хранить данные как на русском, так и на иврите, потому что русский использует кодовую страницу 1251, а иврит использует кодовую страницу 1255 .

Unicode решает эту проблему, используя один гигантский набор кодированных символов с местом для более чем миллиона символов, достаточного для представления всех языков мира. Существует несколько схем кодирования Unicode; Microsoft предпочитает использовать UTF-16 по историческим причинам . Поскольку UTF-16 представляет строки как последовательность 16-битных кодовых единиц вместо традиционных 8-битных, необходим отдельный тип символов. В MSVC ++ это так wchar_t. А в MS SQL это NCHARили NVARCHAR. NОзначает «национальный» , который , кажется , назад ко мне , потому что Unicode о том -nationalization, но это терминология ISO.

Другие реализации SQL позволяют хранить текст UTF-8 в VARCHARстолбце. UTF-8 - это кодировка переменной длины (1-4 байта на символ), которая оптимизирована для случая, когда ваши данные в основном находятся в диапазоне базовой латиницы (которые представлены как один байт на символ как ASCII), но могут представлять любой символ Unicode. Таким образом, вы избежите проблемы «вдвое больше места», упомянутой bwalk2895.

К сожалению, MS SQL Server не поддерживает UTF-8VARCHAR , поэтому вместо этого вам придется либо использовать вместо него UTF-16 (и тратить место на текст ASCII), использовать кодовую страницу не в кодировке Unicode (и потерять способность представлять иностранные символы), или сохраните UTF-8 в BINARYстолбце (и столкнитесь с неудобствами, такими как некорректная работа строковых функций SQL или необходимость просмотра данных в виде шестнадцатеричного дампа в менеджере БД GUI).

dan04
источник
1
В версиях, более ранних, чем SQL Server 2012, они используют кодировку UCS-2, размер которой строго 2 байта. В более новых версиях они используют UTF-16, который отображает переменную длину на 4 байта на символ (аналогично UTF-8, но начинается с 2 байтов).
j123b567