nvarchar (max) против NText


183

Каковы преимущества и недостатки использования типов данных nvarchar(max)против и NTextв SQL Server? Мне не нужна обратная совместимость, поэтому хорошо, что nvarchar(max)она не поддерживается в старых версиях SQL Server.

Изменить: Очевидно, вопрос также относится к TEXTи IMAGEпротив varchar(max)и varbinary(max), для тех, кто ищет эти типы данных позже.

Ответы:


197

Преимущества , которые вы можете использовать такие функции , как LENи LEFTна , nvarchar(max)и вы не можете сделать это против ntextи text. С ним также легче работать, nvarchar(max)чем textтам, где вам приходилось использовать WRITETEXTи UPDATETEXT.

Кроме того , text, ntextи т.д., в настоящее время не рекомендуется ( http://msdn.microsoft.com/en-us/library/ms187993.aspx )


12
SQL Server 2016, очевидно, все еще будет поддерживать их.
Слияние

1
@Confluence Исторически, является ли текст и nText более старым типом данных, чем varchar и nvarchar, с точки зрения их существования в SQL Server?
RBT

Вы НЕ ДОЛЖНЫ использовать WRITETEXT и UPDATETEXT. Может быть, в 2010 году вы сделали, хотя! Заинтересованы в дальнейшей информации.
Simon_Weaver

38

VARCHAR(MAX)достаточно большой, чтобы вместить TEXTполе. TEXT, NTEXTИ IMAGEтипы данных SQL Server 2000 будет устаревшим в версии будущего в SQL Server, SQL Server 2005 обеспечивает обратную совместимость с типами данных , но рекомендуется использовать новые типы данных , которые VARCHAR(MAX), NVARCHAR(MAX)и VARBINARY(MAX).


32

ntextвсегда будет хранить свои данные на отдельной странице базы данных, при этом nvarchar(max)будет пытаться сохранить данные в самой записи базы данных.

Так что nvarchar(max)это немного быстрее (если у вас есть текст, который меньше, чем 8 КБ). Я также заметил, что размер базы данных будет расти немного медленнее, это тоже хорошо.

Go nvarchar(max).


13

nvarchar(max)это то, что вы хотите использовать. Самое большое преимущество заключается в том, что вы можете использовать все строковые функции T-SQL для этого типа данных. Это невозможно с ntext. Я не знаю никаких реальных недостатков.


Чего я не понимаю, так это того, что говорят, nvarchar(max)но это ограничивает меня до 4000 символов. Что если я хочу, чтобы поле содержало больше?
VoidKing

2
nvarchar (max) не ограничивает вас до 4000 символов. У вас есть неограниченное количество персонажей. Кроме того, текст и ntext устарели в SQL Server. Это означает, что в будущей версии они больше не будут поддерживаться.
Рэнди Миндер

ОИК, я использую SQL Server CE, который ограничивает меня nvarchar(max)до 4000 символов. Поэтому для SQL Server Compact у меня нет выбора, кроме как использовать ntextв некоторых случаях. Когда они его прекратят, я полагаю, мне просто не придется обновлять некоторые сайты.
VoidKing

1
@RandyMinder nvarchar (max) не является неограниченным хранилищем. Согласно документации по SQL Server, «max указывает, что максимальный размер хранилища составляет 2 ^ 31-1 байт (2 ГБ). Размер хранилища в байтах в два раза превышает фактическую длину введенных данных + 2 байта».
Шив



3

Хотел добавить свой опыт с конвертированием. У меня было много textполей в древнем коде Linq2SQL. Это должно было позволить перестроитьtext столбцы в индексах ONLINE .

Сначала я знал о преимуществах в течение многих лет, но всегда предполагал, что преобразование будет означать несколько страшных длинных запросов, когда SQL Server придется перестраивать таблицу и копировать все, разрушая мои веб-сайты и повышая мою сердечность.

Я также был обеспокоен тем, что Linq2SQL может вызвать ошибки, если он выполняет какую-то проверку типа столбца.

Рад сообщить, что команды ALTER вернулись мгновенно - поэтому они определенно только меняют метаданные таблицы. Может случиться, что в автономном режиме будет выполнено возвращение данных <8000 символов в таблицу, но команда ALTER была мгновенной.

Я запустил следующее, чтобы найти все столбцы, нуждающиеся в преобразовании:

SELECT concat('ALTER TABLE dbo.[', table_name, '] ALTER COLUMN [', column_name, '] VARCHAR(MAX)'), table_name, column_name
FROM information_schema.columns where data_type = 'TEXT' order by table_name, column_name

SELECT concat('ALTER TABLE dbo.[', table_name, '] ALTER COLUMN [', column_name, '] NVARCHAR(MAX)'), table_name, column_name
FROM information_schema.columns where data_type = 'NTEXT' order by table_name, column_name

Это дало мне хороший список запросов, которые я только что выбрал и скопировал в новое окно. Как я уже сказал - бегать это было мгновенно.

введите описание изображения здесь

Linq2SQL довольно древний - он использует конструктор, на который вы перетаскиваете таблицы. Ситуация может быть более сложной для EF Code в первую очередь, но я еще не решил эту проблему.


1

Я хочу добавить, что вы можете использовать предложение .WRITE для частичных или полных обновлений, а высокая производительность добавляет к varchar(max)/nvarchar(max)типам данных.

Здесь вы можете найти полный пример использования .WRITEпредложения.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.