Я изучаю T-SQL. Из примеров, которые я видел, чтобы вставить текст в varchar()
ячейку, я могу написать только строку для вставки, но для nvarchar()
ячеек в каждом примере строки начинаются с буквы N.
Я пробовал следующий запрос к таблице, в которой есть nvarchar()
строки, и она отлично работает, поэтому префикс N не требуется:
insert into [TableName] values ('Hello', 'World')
Почему строки имеют префикс N во всех примерах, которые я видел?
Каковы плюсы или минусы использования этого префикса?
sql
sql-server
character-encoding
unicode
qinking126
источник
источник
N
означает Национальный, как в «Национальных переменных символах», см. Эквивалентные типы данных ANSI SQL .VARCHAR
вNVARCHAR
мой строковый литерал ASCII?».Ответы:
NVarchar используется для Unicode. Если ваша база данных не хранит многоязычные данные, вы можете использовать Varchar. В качестве примера:
N'abc'
просто преобразует вашу строку в Unicode.источник
U&'abc'
правильный способ указать строки Unicode. Смотрите SQL 2003 BNFПо умолчанию SQL-сервер использует коды символов Windows-1252 для varchar . Он содержит большинство символов для латинских языков (английский, немецкий, французский и т. Д.), Но не содержит символов для нелатинских языков (польский, русский и т. Д.). Как утверждает @Pieter B, nvarchar используется для решения этой проблемы, поскольку он предназначен для Unicode, который содержит эти недостающие символы. Это обходится дорого, для хранения nvarchar требуется вдвое больше места, чем для varchar.
Помещение N перед строкой гарантирует, что символы будут преобразованы в Unicode перед помещением в столбец nvarchar. Большую часть времени вы будете в порядке, оставив N выключенным, но я бы не рекомендовал это. Гораздо лучше быть в безопасности, чем потом сожалеть.
источник
Потому что 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-8
VARCHAR
, поэтому вместо этого вам придется либо использовать вместо него UTF-16 (и тратить место на текст ASCII), использовать кодовую страницу не в кодировке Unicode (и потерять способность представлять иностранные символы), или сохраните UTF-8 вBINARY
столбце (и столкнитесь с неудобствами, такими как некорректная работа строковых функций SQL или необходимость просмотра данных в виде шестнадцатеричного дампа в менеджере БД GUI).источник