Есть ли причина использовать varchar над текстовыми столбцами в базе данных?

36

Это varcharпросто остаток до того, как textпришел, или есть случаи, когда вы хотели бы использовать varchar? (Или charв этом отношении ..)

(Я использую Postgres и MySQL (MyISAM) ежедневно, так что это то, что меня больше всего интересует, но ответы для других баз данных, конечно, приветствуются. ^ _-)

Izkata
источник
6
По крайней мере , для SQL Server , textявляется устаревшим. Есть также соображения об использовании, которые связаны с тем, где хранятся данные и каким образом к ним осуществляется доступ.
Одед
В некоторых СУБД вы не сможете использовать текстовый столбец в выражении sort или where. Я не знаком с Postgres, но проверь вашу документацию.
JQA
1
Этот вопрос StackOverflow может предоставить дополнительную информацию.
J0ANMM

Ответы:

32

В целом

textстолбцы нестандартные и специфичные для реализации. Во многих случаях, в зависимости от базы данных, они могут иметь комбинацию одного или нескольких из следующих ограничений: не индексируется , не подлежит поиску и не сортируется .

В Postgres

Все эти типы сохраняются внутри, используя одну и ту же структуру данных C. ,

В MySQL

textКолонна является специализированной версиейBLOB и имеет ограничения по индексации.

Только эти два примера могут быть экстраполированы на другие системы РСУБД SQL и должны быть достаточной причиной, чтобы понять, когда выбирать один тип по сравнению с другим.

Просто, чтобы сделать это неявно ясным, вы никогда не должны использовать TEXTего, поскольку он проприетарный и нестандартный. Все, что SQLвы напишите против этого, не будет переносимым и гарантированно вызовет у вас проблемы в будущем. Используйте только те типы, которые являются частью стандарта ANSI .

  • Используйте, CHARкогда вы знаете, что у вас есть фиксированное количество символов для каждой записи.
  • Используйте, VARCHARкогда у вас есть переменное количество символов для каждой записи.
  • Если вам нужно больше памяти, чем VARCHARможет предоставить, CLOBс UTF-8кодировкой или эквивалентным стандартным типом.
  • НИКОГДА не используйте, TEXTпоскольку это нестандартно.

источник
1
Принято за non standard and implementation specificи not indexable, not searchable and not sortable, что я не понял. Я под впечатлением text был стандартизирован.
Изката
1
Вы имеете в виду textстандарт ASCII или стандарт UNICODE text:-) или один из других полудюжины textстандартов кодирования?
1
если вы продолжите копаться в документах стандартов SQL, я не думаю, что вы найдете что-то вроде textсимвольного типа. Я ничего не видел, некоторые производители называют это long charи тому подобное, это в основном BLOB с кодировкой.
2
@JarrodRoberson, чтобы быть честным, есть много авторитетных ресурсов, которые делают заключение (когда в среде Postgres), что «всегда используют TEXT». Если вы собираетесь перейти на другую базу данных, что вряд ли дело выключатель, тем более , что вы должны учитывать , что Postgres' неограниченный VARCHAR(из - за TOAST нет никаких ограничений строки , как, например , с MySQL) не может перевести к неограниченным VARCHARин другие базы данных в любом случае.
Каяман
1
... и так как Postgres не поддерживает CLOB , точка от второго до последнего не сохраняется. Вы никогда не сможете поддерживать замену, даже если придерживаетесь стандарта. Кроме того, написание ANSI SQL не является жизнеспособным вариантом в реальном мире, если вы не пишете игрушечный SQL.
Каяман
11

text, varcharИ charвсе они используются по разным причинам. Конечно, есть различия в реализации (сколько они занимают ... и т. Д.), Но есть и соображения по использованию и намерениям . Какой тип вы используете, также говорит вам что-то о типе данных, которые будут храниться в нем (или мы все будем использовать textдля всего ). Если что-то имеет фиксированную длину, мы используем char. Если он имеет переменную длину с четко определенным верхним пределом, используйте varchar. Если это большой кусок текста, над которым у вас мало контроля, то text, вероятно, будет вашим лучшим выбором.

Система не работает
источник
3
Ооооооо, единственное реальное отличие состоит в дублировании проверки границ, которая, вероятно, в любом случае должна быть в программном коде?
Изката
2
@Izkata - есть и отличия в реализации. Речь идет не о проверке границ, а о типе данных . Почтовый индекс (США) - это всегда 5-значный код, поэтому использование чего-то вроде 'char' становится частью определения этого фрагмента данных. Если бы это были только такие вещи, как проверка границ, мы все могли бы просто использовать один тип данных для всего и выполнить нашу проверку и приведение кода.
Система
6
@SystemDown Насколько я знаю, char, varcharи textвсе предназначены для хранения того же типа данных. Так что оба ответа здесь о проверке границ. Если существуют различия в эффективности, каковы они? Зачем мне использовать varcharболее text?
Изката
1
float и double также используются для однотипных данных, но имеют различия и используются по-разному. Что касается различий в реализации, я недостаточно знаком с Postgres, чтобы ответить, что я боюсь.
Система
4
@SystemDown Хотя хранение почтовых индексов в виде символа (5) может вас укусить, если вы начинаете интернационализацию. Почтовые индексы Великобритании различаются по длине и 5 символов почти никогда не бывает достаточно. Я не знаю, имеет ли место место в почтовом индексе Великобритании для анализа.
Vatine
5

Базы данных сильно озабочены производительностью - скоростью и минимизацией хранилища. В большинстве других частей компьютерного мира вас не будет беспокоить количество символов в вашей строке символов; это может быть один, это может быть все содержание энциклопедии; это всего лишь строка. На самом деле, многие языки даже не беспокоятся о том, является ли это строкой или числом.

Но по мере того, как компьютеры работают быстрее и получают больше памяти, люди помещают больше данных в свои базы данных и выполняют более сложные запросы. Для базы данных ЦП и память сегодня столь же ограничены, как и во времена 64КБ основной памяти и 10МБ жестких дисков (на мэйнфреймах ).

С фиксированным числом байтов гораздо проще работать, чем с переменной длиной. С 10 байтами гораздо легче справиться, чем с 1 000 000. Итак, ваша база данных хочет, чтобы вы дали ей подсказку, чтобы она могла дать вам гигабайт результатов из террабайтов данных в микросекундах. Если вы не используете свою базу данных так сильно, вам не понадобится скорость, которую она предлагает, и вы будете раздражены ненужными вопросами. Но если вам нужно представление, вы будете рады дать ему несколько советов.

Как отмечено в других ответах, используйте, charесли оно всегда использует определенное количество символов, varcharесли длина может варьироваться, но она не становится слишком большой (я предполагаю, что большинство БД обрабатывают ее как charили в textзависимости от размера), и textесли она может быть любой длины. Если ваш SQL пытается использовать textстолбец, возможно, было бы лучше как-то суммировать его и поместить в столбец charили в небольшой varcharстолбец, а затем сделать where«и order by». Конечно, это только если производительность важна для вас.

RalphChapin
источник