Я видел комментарий "Если у вас есть 50 миллионов значений от 10 до 15 символов в столбце varchar (20) и те же 50 миллионов значений в столбце varchar (50), они будут занимать ровно одно и то же пространство. вся точка варчара, в отличие от char.". Может ли кто-нибудь сказать мне причину? См. Что такое допустимый предел длины для человека? Name " поля?
Varchar (20) и varchar (50) одинаковы?
Ответ 1
MySQL предлагает выбор механизмов хранения. Физическое хранение данных зависит от механизма хранения.
MyISAM Хранение VARCHAR
В MyISAM VARCHAR
обычно занимают только фактическую длину строки плюс длину байта или два. Это сделано практическим путем ограничения дизайна MyISAM на блокировку таблиц, а не на блокировку строк. Последствия производительности включают более компактный профиль кэша, но также более сложный (более медленный) расчет смещений записей.
(Фактически, MyISAM предоставляет степень выбора между фиксированными физическими размерами строк и переменными форматами таблицы размеров физической строки в зависимости от типов столбцов происходящих во всей таблице. Появление VARCHAR
изменяет только метод по умолчанию, но наличие TEXT
blob заставляет VARCHAR
в той же таблице использовать метод переменной длины.)
Физический метод хранения особенно важен с индексами, который представляет собой другую историю, чем таблицы. MyISAM использует сжатие пространства для столбцов CHAR
и VARCHAR
, что означает, что более короткие данные занимают меньше места в индексе в обоих случаях.
Хранилище InnoDB VARCHAR
InnoDB, как и большинство других существующих реляционных баз данных, использует более сложный механизм. VARCHAR
столбцы, максимальная ширина которых меньше 768 байт, будут сохранены в строке, с зарезервированной комнатой, соответствующей максимальной ширине. Точнее здесь:
Для каждого поля переменной длины, отличного от NULL, заголовок записи содержит длина столбца в одном или двух байтах. Два байта будут только необходимо, если часть столбца хранится извне в переполненных страницах или максимальная длина превышает 255 байт, а фактическая длина превышает 127 байт. Для столбца, хранящегося извне, двухбайтная длина указывает длина внутренней сохраненной части плюс 20-байтовый указатель на внешняя часть хранится. Внутренняя часть составляет 768 байт, поэтому длина 768 + 20. 20-байтовый указатель сохраняет истинную длину столбец.
В настоящее время InnoDB не выполняет сжатие пространства в своих индексах, что противоположно MyISAM, как описано выше.
Вернуться к вопросу
Все вышеперечисленное, однако, представляет собой лишь детальную информацию, которая может даже измениться между версиями. Истинная разница между CHAR
и VARCHAR
является семантической, а также таковой между VARCHAR(20)
и VARCHAR(50)
. Убедившись, что нет способа сохранить строку из 30 символов в VARCHAR(20)
, база данных упрощает и улучшает жизнь для различных процессоров и приложений, которые она предположительно интегрирует в предсказуемое поведение. Это большое дело.
Что касается личных имен, этот вопрос может дать вам некоторые практические рекомендации. Люди с полными именами более 70 символов UTF-8 все равно в беде.
Ответ 2
Да, это действительно весь смысл VARCHAR. Это занимает только столько места, сколько текст длинный.
Если у вас есть CHAR (50), он будет занимать 50 байтов (или символов) независимо от того, насколько короткими являются данные (он будет дополняться, обычно пробелами).
Может ли кто-нибудь сказать мне причину?
Поскольку люди думали, что бесполезно хранить много бесполезных дополнений, они изобрели VARCHAR.
Ответ 3
В руководстве указано:
Типы CHAR и VARCHAR объявляются с длиной, которая указывает максимальное количество символов, которые вы хотите сохранить. (...)
В отличие от CHAR значения VARCHAR сохраняются в виде однобайтового или двухбайтового префикса длины плюс данные. Префикс длины указывает количество байтов в значении. Столбец использует один байт длины, если для значений не более 255 байт, байты длиной 2 байта, если для значений может потребоваться больше 255 байтов.
Обратите внимание, что VARCHAR (255) не совпадает с VARCHAR (256).
Это теория. Как предполагает habeebperwad, фактический размер одной строки зависит от размера страницы (двигателя) и размера жесткого диска.