Varchar (20) и varchar (50) одинаковы?

Я видел комментарий "Если у вас есть 50 миллионов значений от 10 до 15 символов в столбце varchar (20) и те же 50 миллионов значений в столбце varchar (50), они будут занимать ровно одно и то же пространство. вся точка варчара, в отличие от char.". Может ли кто-нибудь сказать мне причину? См. Что такое допустимый предел длины для человека? Name " поля?

Ответ 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, фактический размер одной строки зависит от размера страницы (двигателя) и размера жесткого диска.