VARCHAR против текста в MySQL - PullRequest
20 голосов
/ 19 июня 2011

У меня есть два поля: одно для хранения excerpt с максимальным размером 500 символов, а другое для хранения description с максимальным размером 10000 символов.

Какие типы данных я должен использовать, TEXT или VARCHAR? И почему?

После MySQL 5.0.3 VARCHAR принимает ~ 65000 символов. Но это не говорит, почему я должен использовать один тип или другой.

Я считаю, что я должен использовать VARCHAR для выдержки, потому что я могу назначить ограничение размера, и TEXT для поля description, поскольку оно больше.

Ответы [ 3 ]

14 голосов
/ 19 июня 2011

Длинный VARCHAR хранится так же, как поле TEXT / BLOB в InnoDB (которое, я полагаю, вы используете для транзакционности, ссылочной целостности и восстановления после сбоя, верно?) - что внешне к остальной части таблицы на диске (для извлечения может потребоваться чтение с другого диска).

Из предполагаемого хранилища BLOB, TEXT as ну как долго VARCHAR обрабатываются одинаково путь по Innodb. Вот почему Innodb Руководство называет это «длинные столбцы», а чем BLOB.

источник

Если вам не нужно индексировать эти столбцы (в этом случае VARCHAR намного быстрее), нет смысла использовать VARCHAR сверх TEXT для длинных полей - в MySQL есть некоторые специфические оптимизации движка для настройки извлечение данных в соответствии с длиной, и вы должны использовать правильный тип столбца, чтобы воспользоваться этими преимуществами.

В случае, если вы используете MyISAM, углубленное обсуждение этой темы: здесь .

6 голосов
/ 25 февраля 2014

Разница между VARCHAR и TEXT заключается в том, что вы можете объявить условие DEFAULT для столбца VARCHAR, но не для столбца TEXT.

@ Энди прав, что InnoDB хранит как VARCHAR, так и TEXT одинаково для себя.

Индексы

FULLTEXT поддерживаются как для VARCHAR, так и для TEXT. До 5.6 вы должны использовать MyISAM для получения индекса этого типа. В MySQL 5.6 он наконец поддерживает FULLTEXT в InnoDB. Хотя вы должны тщательно его протестировать, потому что возвращает результаты, отличные от , чем реализация в MyISAM.

Однако Sphinx Search работает быстрее и богаче по сравнению с любой реализацией в MySQL. См. Мой обзор в Throwdown для полнотекстового поиска .

@ Мухаммед спросил:

когда VARCHAR станет считаться LONG VARCHAR? Есть ли порог персонажа?

Если вы объявляете длину до 255 байт, она может закодировать длину данной строки, используя один байт. Если вы объявите максимальную длину столбца более 255 байтов, он будет использовать два байта для кодирования длины.

Вы можете объявить столбец как LONG VARCHAR, но на самом деле это просто псевдоним для MEDIUMTEXT .

mysql> create table test ( l long varchar);

mysql> show create table test\G

CREATE TABLE `test` (
  `l` mediumtext
) ENGINE=InnoDB DEFAULT CHARSET=latin1
3 голосов
/ 19 июня 2011

Если ваш контент помещается в столбец varchar, используйте varchar.

Данные Varchar хранятся в каждой строке.Текстовые данные хранятся в виде больших двоичных объектов вне таблицы.

Согласно этот тест , varchar примерно в три раза быстрее, чем текст.

...