Потому что 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).