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


287

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


17
Якщо Google надіслав вас сюди: сторінка типів даних MSDN може допомогти.
Jeroen

Відповіді:


212

Якщо ви використовуєте SQL Server 2005 або новішу версію, використовуйте varchar(MAX). Тип textданих застарілий і не повинен використовуватися для нових робіт з розробки. З документів :

Важливо

ntext, textта imageтипи даних буде видалено у майбутній версії Microsoft SQL Server. Уникайте використання цих типів даних у нових роботах з розробки та плануйте модифікувати додатки, які зараз їх використовують. Використовуйте замість nvarchar (max) , varchar (max) та varbinary (max) .


3
Дякую, Младене, я здивований, коли текст TEXT застарілий. Чи є у вас якісь офіційні документи, які згадують про це?
Джордж2,

1
Хоча це не є "офіційним", воно висвітлює основи. Текст насправді знецінений, а також не підтримує все, що робить varchar (max), як можливість пошуку та індексування. blog.sqlauthority.com/2007/05/26/…
achinda99

32
це так само офіційно, як це стає :) msdn.microsoft.com/en-us/library/ms187993.aspx
Младен Прадждич

1
Класний achinda99 та Младен Прайдич! Що ви надали, це те, що я шукаю. :-) Ще одне питання: як ми обираємо, чи використовувати VARCHAR чи VARCHAR (MAX) у різних ситуаціях?
Джордж2,

1
Офіційна інформація MS про це засуджується: msdn.microsoft.com/en-us/library/ms187993%28v=sql.90%29.aspx
Fanda

283

TEXTвикористовується для великих фрагментів рядкових даних. Якщо довжина поля перевищила певний поріг, текст зберігається поза рядком.

VARCHARзавжди зберігається в рядку і має обмеження 8000 символів. Якщо ви спробуєте створити a 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добре для:

  • Коментарі в блозі
  • Сторінки Wiki
  • Джерело коду

Деякі приклади того, що VARCHARдобре для:

  • Імена користувачів
  • Назви сторінок
  • Імена файлів

Як правило, використовуйте, якщо вам коли-небудь потрібне значення тексту, яке перевищує 200 символів І не використовуйте приєднання до цього стовпця, використовуйте TEXT.

В іншому випадку використовуйте VARCHAR.

PS Те ж саме стосується UNICODEввімкненого NTEXTта іншого NVARCHAR, що ви повинні використовувати для наведених вище прикладів.

PPS Те саме стосується VARCHAR(MAX)і того, NVARCHAR(MAX)що замість та використовує SQL Server 2005+ . Вам потрібно буде включити їх, якщо ви хочете, щоб вони завжди зберігалися поза рядком.TEXTNTEXTlarge value types out of rowsp_tableoption

Як було сказано вище та тут , TEXTу наступних випусках буде застаріло:

Цей text in rowпараметр буде видалено в майбутній версії SQL Server . Уникайте використання цієї опції в нових роботах з розробки та плануйте змінювати додатки, які зараз використовуються text in row. Ми рекомендуємо зберігати великі обсяги даних, використовуючи varchar(max), nvarchar(max)або varbinary(max)тип даних. Щоб керувати поведінкою цих типів даних для рядків та поза рядків, використовуйте large value types out of rowпараметр.


2
1. "Якщо ви не шукаєте значення стовпця" - ви могли б показати мені, що ви маєте на увазі "пошук"? Ви маєте на увазі вибрати цей стовпець, замовити цей стовпець, ПОДИМИТИ цей стовпець або використовуючи деяку функцію маніпулювання рядком у цьому стовпці?
Джордж2,

2
2. "VARCHAR завжди зберігається в рядку і має обмеження в 8000 символів." - вибачте, що з вами не згоден. VARCHAR може бути довше 8000, а якщо довше 8000, VARCHAR буде зберігатися інакше, ніж у стовпцях. Будь-які коментарі?
Джордж2

1
3. Младен Прадждич, згаданий у цій темі, тип ТЕКСТУ є застарілим, але я не знаю, що жодні документи висвітлюють це. Чи є у вас документи, які це стосуються?
Джордж2,

2
Класний Квасной! Ви такі знаючі! :-) Ще одне питання - "Це, звичайно, не стосується VARCHAR (MAX), що є для SQL SERVER 2005 синонімом TEXT." "Це" ти маєш на увазі що?
Джордж2,

"Це, звичайно, не стосується VARCHAR (MAX), що є для SQL SERVER 2005 синонімом TEXT." - чи є у вас документи, в яких сказано, що TEXT такий самий, як VARCHAR у SQL Server 2005? Я здійснив деякий пошук, але не можу знайти офіційних документів. :-)
George2

41

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

Також varchar (max) зберігається у просторі (диска / пам'яті) таблиці, тоді як розмір нижче 8Kb. Тільки коли ви розміщуєте більше даних у полі, вони зберігаються поза простором таблиці. Дані, що зберігаються в просторі таблиці, (як правило) отримуються швидше.

Якщо коротко, ніколи не використовуйте Text, оскільки є краща альтернатива: (n) varchar (max). І використовувати лише varchar (max), коли звичайний варчар недостатньо великий, тобто якщо ви очікуєте, що їх рядок, який ви збираєтеся зберігати, перевищить 8000 символів.

Як було зазначено, ви можете використовувати SUBSTRING на типі даних TEXT, але лише в тому випадку, якщо поля TEXT містять менше 8000 символів.


1
Спасибі Edoode, ти цілком відповів, наскільки хороший VARCHAR, але будь-які коментарі чи ідеї щодо того, коли використовувати VARCHAR та коли використовувати TEXT? Моє запитання щодо вибору 1 з 2 випуску. :-)
George2

1
Насправді в MS SQL Server 2005 ви можете використовувати SUBSTRING та інші функції в стовпцях TEXT.
Quassnoi

1
Спасибі Квасно! Схоже, TEXT застарілий. Ще одне питання: як ми обираємо, чи використовувати VARCHAR чи VARCHAR (MAX) у різних ситуаціях?
Джордж2

1
Використовуйте varchar (max) лише тоді, коли звичайний varchar недостатньо великий (8Kb повинно вистачити на всіх;)
edosoft

7

У 2008 р. Відбулися деякі істотні зміни. - Можливо, варто врахувати наступну статтю, приймаючи рішення про те, який тип даних використовувати. http://msdn.microsoft.com/en-us/library/ms143432.aspx

Байтів per

  1. varchar (max), varbinary (max), xml, текстовий або графічний стовпчик 2 ^ 31-1 2 ^ 31-1
  2. nvarchar (max) стовпчик 2 ^ 30-1 2 ^ 30-1

3
Зміни? Ці можливості не змінилися з моменту введення нових типів даних.
Мартін Сміт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.