Розміри типів TEXT:
TINYTEXT- до 255 байтів;TEXT- до 64 КБ;MEDIUMTEXT- до 16 МБ;LONGTEXT- до 4 ГБ.
Ліміти - у байтах: в utf8mb4 TEXT вміщує від ~16 до 64 тисяч символів залежно від мови.
Відмінності від VARCHAR:
- Ліміт рядка таблиці. Усі колонки рядка разом - не більше 65 535 байтів, і
VARCHARвраховується повністю.TEXTзаймає в цьому ліміті лише 9-12 байтів (вміст зберігається окремо), тож довгі тексти - лишеTEXT. - Індекси. Індекс на
TEXTможливий лише за префіксом (INDEX (body(100))), повний унікальний індекс - ні.VARCHARіндексується цілком (в межах ліміту ключа 3072 байти). - Значення за замовчуванням. Для
TEXT- лише як вираз у дужках (з MySQL 8.0.13);VARCHARприймає звичайний літерал. - Зберігання. InnoDB з форматом рядка
DYNAMICвиносить великі значення на окремі сторінки. Запит, що вибирає такі колонки (SELECT *), читає ці сторінки - звідси повільні списки.
Як обирати:
- Обмежений короткий текст (імена, заголовки, email, URL) -
VARCHARз розумною довжиною. - Довгий текст без жорсткої межі (статті, коментарі, описи, сирий HTML) -
TEXT/MEDIUMTEXT. - Великі бінарні дані (файли) - у сховище (S3), а в базі - шлях;
BLOBлише для невеликих бінарних значень.
Практичні наслідки:
- Не вибирайте
TEXT-колонки в списках:select(['id', 'title'])замістьSELECT *. - Для пошуку по тексту
LIKE '%...%'наTEXT- повний перегляд таблиці. ПотрібенFULLTEXT-індекс або пошуковий рушій. - У Laravel
$table->string()-VARCHAR(255),$table->text()-TEXT,$table->longText()-LONGTEXT.