1 ответ:
TL; DR
TEXT
- фиксированный максимальный размер 65535 символов (вы не можете ограничить максимальный размер)
- занимает 2 +
cбайт дискового пространства, гдеc- длина сохраненной строки.- не может быть частью индекса
VARCHAR(M)
- переменный максимальный размер
MсимволыMдолжен быть между 1 и 65535- занимает 1 +
cбайт (дляM≤ 255) или 2 +c(для 256 ≤M≤ 65535) байт дискового пространства, гдеc- это длина хранимой строки- может быть частью индекса
Более Подробная Информация
TEXTесть основные максимальный размер2¹⁶-1 = 65535символы.VARCHARесть переменная максимальный размерMдоM = 2¹⁶-1.
Так что вы не можете выбрать размерTEXTно вы можете дляVARCHAR.другое отличие заключается в том, что вы не можете поместить индекс (за исключением полнотекстового индекса) на .
Поэтому, если вы хотите иметь индекс в столбце, вы должны использоватьVARCHAR. Но обратите внимание, что длина индекса также ограничена, поэтому если ваш слишком долго вы должны использовать только первые несколько символовVARCHARстолбец в вашем индексе (см. документацию дляCREATE INDEX).но вы также хотите использовать
VARCHAR, если вы знаете, что максимальная длина возможной входной строки толькоM, например, номер телефона или имя или что-то подобное. Тогда вы можете использоватьVARCHAR(30)вместоTINYTEXTилиTEXTи если кто-то пытается сохранить текст всех трех книг "Властелин кольца" в столбце номер телефона вы храните только первые 30 символов :)Edit: если текст, который вы хотите хранить в базе данных более 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. Вы можете прочитать больше об этом здесь.
Comments