Текстовый тип SQL Server и тип данных varchar [закрыто]

287

У меня есть символьные данные переменной длины, и я хочу сохранить их в базе данных SQL Server (2005). Я хочу изучить некоторые рекомендации по выбору типа SQL TEXT или типа VARCHAR SQL, плюсы и минусы в производительности / занимаемой площади / функции.

George2
источник
17
Если Google отправил вас сюда: может помочь страница MSDN SQL Types .
Jeroen

Ответы:

213

Если вы используете SQL Server 2005 или более позднюю версию, используйте varchar(MAX). Тип textданных устарел и не должен использоваться для новых разработок. Из документов :

Важный

ntext, text, И imageтипы данных будут удалены в версии будущего от Microsoft SQL Server. Избегайте использования этих типов данных в новых разработках и планируйте модифицировать приложения, которые их используют в настоящее время. Используйте взамен nvarchar (max) , varchar (max) и varbinary (max) .

Младен Прайдич
источник
3
Спасибо, Младен, я удивлен, что TEXT устарел. Есть ли у вас официальные документы, подтверждающие это?
George2
1
Хотя это и не «официально», оно охватывает основы. Текст фактически устарел и также не поддерживает все, что делает varchar (max), например, возможность поиска и индексации. blog.sqlauthority.com/2007/05/26/…
achinda99
32
это настолько важно, насколько это возможно :) msdn.microsoft.com/en-us/library/ms187993.aspx
Младен Прайдик
1
Крутая ахинда99 и Младен Прайдич! То, что вы предоставили, это то, что я ищу. :-) Еще один вопрос, как мы выбираем, использовать ли VARCHAR или VARCHAR (MAX) в разных ситуациях?
George2
1
Официальная информация MS об этом устарела: msdn.microsoft.com/en-us/library/ms187993%28v=sql.90%29.aspx
Fanda
284

TEXTиспользуется для больших кусков строковых данных. Если длина поля превышает определенный порог, текст сохраняется вне строки.

VARCHARвсегда хранится в строке и имеет ограничение в 8000 символов. Если вы попытаетесь создать VARCHAR(x), где x> 8000 , вы получите ошибку:

Сервер: Msg 131, Уровень 15, Состояние 3, Линия 1

Размер (), присвоенный типу 'varchar', превышает максимально допустимый для любого типа данных (8000).

Эти ограничения по длине не относятся VARCHAR(MAX)к SQL Server 2005 , который может храниться вне строки, как TEXT.

Обратите внимание, что MAXэто не своего рода константа, VARCHARи VARCHAR(MAX)это очень разные типы, последний очень близок к TEXT.

В предыдущих версиях SQL Server не может получить доступ к TEXTнапрямую, вы только могли бы получить TEXTPTRи использовать его в READTEXTи WRITETEXTфункции.

В SQL Server 2005 вы можете получить прямой доступ к TEXTстолбцам (хотя вам все еще нужно явное приведение, VARCHARчтобы назначить для них значение).

TEXT это хорошо:

  • Если вам нужно хранить большие тексты в вашей базе данных
  • Если вы не ищете по значению столбца
  • Если вы выбираете этот столбец редко и не присоединяетесь к нему.

VARCHAR это хорошо:

  • Если вы храните маленькие строки
  • Если вы ищете по строковому значению
  • Если вы всегда выбираете его или используете в соединениях.

Под выбором здесь я подразумеваю выдачу любых запросов, которые возвращают значение столбца.

Под поиском здесь я подразумеваю выдачу любых запросов, результат которых зависит от значения столбца TEXTили VARCHAR. Это включает в себя использование его в любом JOINили WHEREсостоянии.

Поскольку значение TEXTхранится вне строки, запросы, не связанные со TEXTстолбцом, обычно выполняются быстрее.

Некоторые примеры того, что TEXTхорошо для:

  • Комментарии блога
  • Вики-страницы
  • Исходный код

Некоторые примеры того, что VARCHARхорошо для:

  • Usernames
  • Заголовки страниц
  • Имена файлов

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

В противном случае используйте VARCHAR.

PS То же самое относится и к UNICODEвключенным, NTEXTи NVARCHARк тому, что вы должны использовать в примерах выше.

PPS То же самое относится VARCHAR(MAX)и к тому, NVARCHAR(MAX)что SQL Server 2005+ использует вместо TEXTи NTEXT. Вам нужно включить large value types out of rowих с помощью, sp_tableoptionесли вы хотите, чтобы они всегда хранились вне строки.

Как упомянуто выше и здесь , TEXTбудет объявлено устаревшим в следующих выпусках:

Эта text in rowопция будет удалена в следующей версии SQL Server . Избегайте использования этой опции в новых разработках и планируйте модифицировать приложения, которые используются в настоящее время text in row. Мы рекомендуем хранить большие объемы данных, используя varchar(max), nvarchar(max)или varbinary(max)тип данных. Чтобы управлять поведением этих типов данных в строках и вне строк, используйте large value types out of rowпараметр.

Quassnoi
источник
2
1. «Если вы не ищите по значению столбца» - не могли бы вы показать мне, что вы имеете в виду «поиск»? Вы имеете в виду выбрать этот столбец, упорядочить этот столбец, НРАВИТСЯ этот столбец или использовать некоторую функцию манипуляции со строками в этом столбце?
George2
2
2. «VARCHAR всегда хранится в строке и имеет ограничение в 8000 символов». - извините, я не согласен с вами. VARCHAR может быть длиннее 8000, а если длиннее 8000, VARCHAR будет храниться не в столбцах. Любые комментарии?
George2
1
3. Mladen Prajdic, упомянутый в этой теме, тип TEXT устарел, но я не нахожу никаких документов, подтверждающих это. Есть ли у вас какие-либо документы на это?
George2
2
Клевый Кассной! Ты такой знающий! :-) Еще один вопрос - «Это, конечно, не касается VARCHAR (MAX), который для SQL SERVER 2005 является синонимом TEXT». "Это" ты имеешь ввиду что?
George2
«Это, конечно, не относится к VARCHAR (MAX), который для SQL SERVER 2005 является синонимом TEXT». - есть ли у вас документы, в которых говорится, что TEXT такой же, как VARCHAR в SQL Server 2005? Я провел поиск, но не могу найти официальные документы. :-)
George2
42

В сервере SQL были введены 2005 новых типов данных: varchar(max)и nvarchar(max) они имеют преимущества старого типа текста: они могут содержать оп 2 Гб данных, но они также имеют большинство преимуществ varcharи nvarchar. Среди этих преимуществ - возможность использовать функции манипуляции со строками, такие как substring ().

Кроме того, varchar (max) хранится в пространстве таблицы (диск / память), пока его размер не превышает 8 КБ. Только когда вы размещаете больше данных в поле, они сохраняются вне пространства таблицы. Данные, хранящиеся в пространстве таблицы, (обычно) извлекаются быстрее.

Короче говоря, никогда не используйте Text, так как есть лучшая альтернатива: (n) varchar (max). И используйте varchar (max) только тогда, когда обычный varchar недостаточно велик, т.е. если вы ожидаете, что строка, которую вы собираетесь хранить, будет превышать 8000 символов.

Как было отмечено, вы можете использовать SUBSTRING для типа данных TEXT, но только если поля TEXT содержат менее 8000 символов.

edosoft
источник
1
Спасибо, Edoode, вы достаточно полно ответили, насколько хорош VARCHAR, но есть ли комментарии или идеи о том, когда использовать VARCHAR, а когда использовать TEXT? Мой вопрос о выборе 1 из 2-х выпусков. :-)
George2
1
На самом деле, в MS SQL Server 2005 вы также можете использовать SUBSTRING и другие функции для столбцов TEXT.
Quassnoi
1
Спасибо Кассной! Похоже, TEXT устарела. Еще один вопрос, как мы выбираем, использовать ли VARCHAR или VARCHAR (MAX) в разных ситуациях?
George2
1
Используйте varchar (max) только тогда, когда обычный varchar недостаточно велик (8Kb должно быть достаточно для всех;)
edosoft
7

В MS 2008 произошли некоторые важные изменения -> Возможно, стоит принять во внимание следующую статью при принятии решения о том, какой тип данных использовать. http://msdn.microsoft.com/en-us/library/ms143432.aspx

Байт в

  1. varchar (макс.), varbinary (макс.), xml, текст или столбец изображения 2 ^ 31-1 2 ^ 31-1
  2. nvarchar (max) столбец 2 ^ 30-1 2 ^ 30-1
Draz
источник
3
Изменения? Эти возможности не изменились с тех пор, как были введены новые типы данных.
Мартин Смит