2015-09-04 6 views
2

Im создание веб-сайта, который может содержать символы юникода, в котором клиент не указал, я хочу использовать nvarchar в качестве типа данных на сервере sql. Есть ли недостаток в использовании nvarchar над varchar.Что не всегда использует nvarchar над varchar при хранении данных?

Почему каждый хочет использовать varchar над nvarchar, если nvarchar может содержать больше символов varchar. Единственный недостаток стороны использования nvarchar в том, что данные будут больше в nvarchar, чем varchar?

Также может ли Nvarchar хранить все символы, хранящиеся в varchar?

+1

Возможный дубликат [В чем разница между varchar и nvarchar?] (Http://stackoverflow.com/questions/144283/what-is-the-difference-between-varchar-and-nvarchar) –

+0

Другие вопросы и ответы та же тема http://stackoverflow.com/questions/612430/when-must-we-use-nvarchar-nchar-instead-of-varchar-char-in-sql-server –

+0

'nvarchar' использует вдвое больше места для хранения, чем 'varchar' (всегда 2 байта на символ вместо 1). Так что, если вы действительно не нуждаетесь в символах Unicode, это просто пустая трата пространства. –

ответ

4

Я думаю, что (косвенная) точка, которую вы делаете, состоит в том, что вы почти всегда хотите ее использовать. В общем, лучше всего начинать принимать данные Unicode с самого начала, иначе вы получите устаревшую головную боль, которую вы не хотите. Вы будете удивлены тем, что вы можете упустить из-за ожидаемого ввода. И системы имеют привычку становиться больше, чем вы ожидали, с необходимостью обработки интернационализированных материалов. Есть определенные поля, которые вы хотите ограничить. Например, если вы храните имена доменов, поддержка разных систем для многоязычных символов, вероятно, будет ненадежной (она обрабатывается), поэтому вы захотите ограничить ввод таких вещей. В таких случаях вам необходимо ограничить ввод на более высоком уровне, например, с помощью регулярных выражений на уровне пользовательского интерфейса, иначе, если вы объявили поле varchar в базе данных, вы просто закончите с совершенно неправильным символом сохраняются, если символ Юникода удается пройти.

пространство не является проблемой в эти дни, однако есть соображения производительности, хотя сценарии вряд ли перевесит необходимость масштабируемости:

https://msdn.microsoft.com/en-us/library/ms189617.aspx

Критической точкой является то, что вам нужно явно указать что вы используете UTF-8 последовательно на всех уровнях применения для полной международной поддержки.

+1

True - по большей части. Но если вам нужно, например, сохраните серийный номер или IP-адрес в виде строки, которая состоит только из числа и точек и тире и т. д., вы можете вместо этого использовать «varchar» и обеспечить себе несколько байтов для каждой сохраненной строки .... пространство все еще ** IS * * проблема, когда дело доходит до основной памяти занятого сервера! –

3

Выбор типов данных - это такое же искусство, как и наука. Но когда дело доходит до этого, выбранный вами тип подразумевает ограничение. Например, я бы не выбрал nvarchar (50) для хранения американского почтового индекса. Поэтому не просто следите за nvarchar, потому что это более разрешительно - это не особенность! Выберите nvarchar, потому что вы по праву считаете, что поле должно содержать символы Unicode. Это означает, что это может быть не для всех ваших столбцов.

Что касается вашего второго вопроса, nvarchar является строгим надмножеством varchar.