Что не всегда использовать nvarchar над varchar при хранении данных?
Я создаю веб-сайт, на котором могут быть символы юникода, которые клиент не указал, я хочу использовать nvarchar в качестве типа данных на сервере sql. Есть ли недостатки использования nvarchar над varchar.
Зачем кому-то хотеть использовать varchar вместо nvarchar, если nvarchar может содержать больше символов varchar. Единственным недостатком использования nvarchar является то, что в nvarchar будет больше данных, чем в varchar?
Также может ли Nvarchar хранить все символы, которые хранит varchar?
3 ответа
Я думаю, что (косвенное) замечание, которое вы делаете, заключается в том, что вы почти всегда хотите использовать его. В общем, лучше начинать принимать данные в кодировке Unicode с самого начала, в противном случае вы получите устаревшую головную боль, которая вам не нужна. Вы будете удивлены тем, что вы можете упустить из-за ожидаемого вклада. И системы имеют привычку становиться больше, чем вы ожидали, с необходимостью обрабатывать интернационализированный вклад. Есть определенные поля, которые вы хотите ограничить. Например, если вы храните доменные имена, то поддержка многоязычных символов в разных системах, скорее всего, все еще будет ненадежной (над ней работают), поэтому вы захотите ограничить ввод для подобных вещей. В этих случаях вам нужно ограничить ввод на более высоком уровне, например, с помощью регулярных выражений на уровне пользовательского интерфейса, в противном случае, если вы объявите поле varchar в базе данных, вы просто получите совершенно неправильный символ хранится, если юникод-символу удается пройти.
Пространство не является проблемой в наши дни, однако есть соображения производительности, хотя сценарии маловероятны, что перевесят потребность в масштабируемости:
https://msdn.microsoft.com/en-us/library/ms189617.aspx
Критическим моментом является то, что вам необходимо явно указать, что вы используете UTF-8 на всех уровнях приложений для полной международной поддержки.
Выбор типов данных - это столько же искусство, сколько наука. Но когда дело доходит до этого, тип, который вы выбираете, подразумевает ограничение. Например, я бы не стал использовать nvarchar(50) для хранения американского почтового индекса. Так что не выбирайте nvarchar вслепую, потому что он более вседозволен - это не особенность! Выберите nvarchar, потому что вы правомерно полагаете, что поле должно будет содержать символы Unicode. То есть, это может быть не для всех ваших столбцов.
Что касается вашего второго вопроса, nvarchar - это строгий надмножество varchar.
Я всегда использую varchar и привожу как nvarchar как в моих хранимых процедурах/функциях sql и т. д., так и в моих классах vb.net, где это необходимо. Тем не менее, вся моя работа в настоящее время является «национальной», а не международной. Но при развертывании в облачных архитектурах, таких как Azure, и работе с миллиардами строк и тысячами столбцов большое значение имеет пространство. Это становится дорого. Любой способ ограничить количество места, которое вам нужно потреблять, является бонусом в моей линии.