nvarchar (max) против NText - PullRequest
       37

nvarchar (max) против NText

173 голосов
/ 25 января 2010

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

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

Ответы [ 8 ]

184 голосов
/ 25 января 2010

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

Кроме того, text, ntext и т. Д. Устарели (http://msdn.microsoft.com/en-us/library/ms187993.aspx)

37 голосов
/ 25 января 2010

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

32 голосов
/ 02 июня 2010

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

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

Go nvarchar(max).

12 голосов
/ 25 января 2010

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

4 голосов
/ 25 января 2010

Вы, очевидно, должны использовать nvarchar(max):

* MSDN 1006 *

4 голосов
/ 25 января 2010

Самым большим недостатком Text (вместе с NText и Image) является то, что он будет удален в будущей версии SQL Server, как и в документации .Это эффективно усложнит обновление вашей схемы после выпуска этой версии SQL Server.

1 голос
/ 22 мая 2018

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

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

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

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

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

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

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

enter image description here

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

1 голос
/ 10 октября 2014

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

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

...