Самая большая проблема заключается в том, что nvarcharиспользуется 2 байта на символ, тогда как varcharиспользуется 1. Таким образом, nvarchar(4000)используется тот же объем памяти, что и varchar(8000)*.
В дополнение ко всем вашим данным персонажей, требующим вдвое больше места для хранения, это также означает:
- Возможно, вам придется использовать более короткие
nvarcharстолбцы, чтобы сохранить строки в пределах 8060 байт / 8000 байт.
- Если вы используете
nvarchar(max)столбцы, они будут вытеснены из строки раньше, чем varchar(max)будут.
- Возможно, вам придется использовать более короткие
nvarcharстолбцы, чтобы остаться в пределах ограничения на индексный ключ в 900 байт (я не знаю, почему вы захотите использовать такой большой индексный ключ, но вы никогда не знаете).
Кроме того, работа с nvarcharне сильно отличается, если предположить, что ваше клиентское программное обеспечение построено для обработки Unicode. SQL Server будет прозрачно реконвертирование varcharк nvarchar, поэтому строго не нужен N префикса для строковых литералов , если вы не используете 2-байты (т.е. Unicode) символы в буквальном. Имейте nvarcharв varbinaryвиду, что приведение к дает другие результаты, чем при том же varchar. Важным моментом является то, что вам не нужно сразу менять каждый литерал varchar на литерал nvarchar, чтобы приложение работало, что помогает упростить процесс.
* Если вы используете сжатие данных (достаточно простого сжатия строк, требуется Enterprise Edition до SQL Server 2016 с пакетом обновления 1 ), вы, как правило, находите ncharи nvarcharзанимает не больше места, чем charи varcharиз-за сжатия Unicode (с использованием алгоритма SCSU) .