Разница между VARCHAR и TEXT в mysql

Когда мы создаем таблицу в mysql с столбцом VARCHAR, мы должны установить для нее длину. Но для типа TEXT нам не нужно указывать длину.

В чем разница между VARCHAR и TEXT?

Ответ 1

TL; DR

TEXT

  • фиксированный максимальный размер 65535 символов (вы не можете ограничить максимальный размер)
  • принимает 2 + c байты дискового пространства, где c - длина сохраненной строки.
  • не может быть частью индекса

VARCHAR(M)

  • переменный максимальный размер M символов
  • M должно быть от 1 до 65535
  • принимает 1 + c байты (для M & le; 255) или 2 + c (для 256 & le; M & le; 65535) байты дискового пространства, где c - это длина сохраненная строка
  • может быть частью индекса

Подробнее

TEXT имеет фиксированный максимальный размер 2¹⁶-1 = 65535 символов.
VARCHAR имеет переменную максимальный размер M до M = 2¹⁶-1.
Поэтому вы не можете выбрать размер TEXT, но вы можете использовать VARCHAR.

Другое отличие состоит в том, что вы не можете поместить индекс (за исключением полнотекстового индекса) в столбец TEXT.
Поэтому, если вы хотите иметь индекс в столбце, вы должны использовать VARCHAR. Но обратите внимание, что длина индекса также ограничена, поэтому, если ваш столбец VARCHAR слишком длинный, вам нужно использовать только первые несколько символов столбца VARCHAR в вашем индексе (см. Документацию для CREATE INDEX).

Но вы также хотите использовать VARCHAR, если знаете, что максимальная длина возможной строки ввода - это только M, например. номер телефона или имя или что-то в этом роде. Затем вы можете использовать VARCHAR(30) вместо TINYTEXT или TEXT, и если кто-то попытается сохранить текст всех трех книг "Властелин кольца" в вашей телефонной колонке, вы сохраните только первые 30 символов:)

Изменить: Если текст, который вы хотите сохранить в базе данных, длиннее 65535 символов, вам нужно выбрать MEDIUMTEXT или LONGTEXT, но будьте осторожны: MEDIUMTEXT хранит строки вверх до 16 МБ, LONGTEXT до 4 ГБ. Если вы используете LONGTEXT и получаете данные через PHP (по крайней мере, если вы используете mysqli без store_result), возможно, вы получите ошибку распределения памяти, потому что PHP пытается выделить 4 ГБ памяти, чтобы убедиться, что вся строка может быть буферизирована. Возможно, это происходит и на других языках, кроме PHP.

Однако перед тем, как сохранить его в базе данных, вы должны всегда проверять ввод (слишком ли длинный? содержит ли он странный код?).

Примечание. Для обоих типов требуемое дисковое пространство зависит только от длины сохраненной строки, а не от максимальной длины.
Например. если вы используете кодировку latin1 и сохраняете текст "Test" в VARCHAR(30), VARCHAR(100) и TINYTEXT, для этого всегда требуется 5 байтов (1 байт для хранения длины строки и 1 байт для каждого символа). Если вы сохраняете один и тот же текст в столбце VARCHAR(2000) или TEXT, для него также потребуется одно и то же пространство, но в этом случае это будет 6 байтов (2 байта для хранения длины строки и 1 байт для каждого символ).

Для получения дополнительной информации см. документацию .

Наконец, я хочу добавить уведомление о том, что оба типа TEXT и VARCHAR являются типами данных переменной длины, поэтому они скорее всего минимизируют пространство, необходимое для хранения данных. Но это связано с компромиссом для производительности. Если вам нужна более высокая производительность, вы должны использовать тип фиксированной длины, например CHAR. Вы можете прочитать об этом здесь.