Когда мы создаем таблицу в mysql с столбцом VARCHAR
, мы должны установить для нее длину. Но для типа TEXT
нам не нужно указывать длину.
В чем разница между VARCHAR
и TEXT
?
Когда мы создаем таблицу в mysql с столбцом VARCHAR
, мы должны установить для нее длину. Но для типа TEXT
нам не нужно указывать длину.
В чем разница между VARCHAR
и TEXT
?
TEXT
c
байты дискового пространства, где c
- длина сохраненной строки. VARCHAR(M)
M
символовM
должно быть от 1 до 65535c
байты (для 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
. Вы можете прочитать об этом здесь.