Я видел комментарий «Если у вас есть 50 миллионов значений между 10 и 15 символами в столбце varchar (20) и те же 50 миллионов значений в столбце varchar (50), они будут занимать ровно одно и то же пространство. целая точка варчара, в отличие от символа ». Может ли кто-нибудь сказать мне причину? См. What is a reasonable length limit on person "Name" fields?varchar (20) и varchar (50) одинаковы?
ответ
MySQL предлагает выбор двигателей хранения. Физическое хранение данных зависит от механизма хранения.
MyISAM Хранение VARCHAR
В MyISAM, VARCHAR
ы, как правило, занимают только фактическую длину строки плюс один байт или два из длины. Это сделано практическим путем ограничения дизайна MyISAM на блокировку таблиц, а не на блокировку строк. Последствия производительности включают более компактный профиль кеша, но также более сложное (более медленное) вычисление смещений записей.
(На самом деле, MyISAM дает a degree of choice между фиксированным физическим размером строк и переменными физических размерами рядов форматами таблиц в зависимости от типов столбцов, происходящих во всей таблице. Появление VARCHAR
изменяет метод по умолчанию только, но наличие TEXT
сгустка силыVARCHAR
с в той же таблице, чтобы использовать метод переменной длины, а также.)
метод физического хранения имеет особенно важное значение с индексами, что другая история, чем таблицы. MyISAM использует сжатие пространства для какCHAR
, так и VARCHAR
, что означает, что более короткие данные занимают меньше места в индексе в обоих случаях.
InnoDB Хранение VARCHAR
InnoDB, как и большинство других текущих реляционных баз данных, использует более сложный механизм. VARCHAR
столбцы, максимальная ширина которых составляет менее 768 байт, будут сохранены в строке, с зарезервированной комнатой, соответствующей максимальной ширине. Более точно here:
Для каждого ненулевого поле переменной длины, заголовок записи содержит длина колонки в одном или двух байтов. Два байта будут только , если часть столбца хранится извне в переполненных страницах или Максимальная длина превышает 255 байт, а фактическая длина превышает 127 байт. Для столбца, хранящегося извне, длина двухбайтов указывает длину внутренней хранимой части плюс 20-байтовый указатель на часть, хранящуюся извне. Внутренняя часть составляет 768 байт, поэтому длина составляет 768 + 20. 20-байтовый указатель сохраняет истинную длину столбца .
В настоящее время InnoDB не выполняет сжатие пространства в своих индексах, противоположное MyISAM, как описано выше.
Вернуться к вопросу
Все вышесказанное, однако, лишь на реализацию деталь, которая может даже изменить между версиями. Истинная разница между CHAR
и VARCHAR
является семантической, а также между VARCHAR(20)
и VARCHAR(50)
. Убедившись, что нет способа сохранить строку из 30 символов в VARCHAR(20)
, база данных упрощает и улучшает жизнь для различных процессоров и приложений, которые она предположительно интегрирует в предсказуемое поведение. Это большое дело.
Что касается личных имен, то this question может дать вам практическое руководство. В любом случае, люди с полными именами более 70 символов UTF-8.
Да, это действительно целая точка VARCHAR. Это занимает всего столько места, сколько текст длинный.
Если у вас есть CHAR (50), это займет до 50 байтов (или символов) независимо от того, насколько короткими данные на самом деле (он будет дополнен, как правило, пробелами).
Может ли кто-нибудь сказать мне причину?
Поскольку люди считали расточительным хранить много бесполезной прокладки, они изобрели VARCHAR.
Это на самом деле немного сложнее, чем «бесполезная прокладка»: как сказать '' foo'' '' foo ''в CHAR (4)? –
Правда. Вроде. Это может быть важно для некоторых людей.Я всегда получаю много downvotes, когда я это делаю (обычно в контексте решения Oracle обрабатывать пустые строки как NULL), но я сомневаюсь в дизайне приложения, который должен различать «foo» и «foo», (как вы можете видеть из этой темы комментариев, цитаты могут быть возможным решением здесь тоже, или вы можете использовать что-то другое, которое иначе не используется). – Thilo
Чтобы поднять позитив относительно CHAR: он позволяет записывать фиксированную длину. Может быть важным для некоторых приложений специального назначения. – Thilo
The manual состояния:
Типы CHAR и VARCHAR объявляются с длиной, которая указывает максимальное количество символов, которые вы хотите сохранить. (...)
В отличие от CHAR, значения VARCHAR сохраняются как префикс длины в 1 байт или два байта плюс данные. Префикс длины указывает количество байтов в значении. Столбец использует один байт длины, если значения не более 255 байт, два байта длины, если для значений может потребоваться больше 255 байт.
Обратите внимание, что VARCHAR (255) является не такой же, как VARCHAR (256).
Это теория. Как предполагает habeebperwad, фактический размер одной строки зависит от размера страницы (двигателя) и размера жесткого диска.
- 1. новообращенный даты и времени на VARCHAR (50)
- 2. В чем разница между VARCHAR 50 и VARCHAR 50 байт в Oracle?
- 3. MySQL: Зачем использовать VARCHAR (20) вместо VARCHAR (255)?
- 4. SQL: Почему varchar (50) по умолчанию?
- 5. Как преобразовать DateTime в VarChar (50)?
- 6. преобразование varchar (50) в datetime и заполнение остальной части таблицы
- 7. MySQL BIGINT (20) против Varchar (31) производительность
- 8. В SQL Server конкретно Varchar (50) занимает такое же пространство, как Varchar (MAX)?
- 9. Varchar (255) to Varchar (MAX)
- 10. Имеет ли varchar (max) = varchar?
- 11. Продлить таблицу VARCHAR с VARCHAR
- 12. Сравнение MySQL varchar и IBM DB2 varchar dataype
- 13. Varchar (max) 2008 to varchar в 2000
- 14. FluentNHibernate и VARCHAR Columns
- 15. Разница в производительности при вставке значения в столбце varchar (50) vs varchar (2000)?
- 16. SqlServer Exception Encounted «VARCHAR»
- 17. VARCHAR optimization then update
- 18. NUMERIC и VARCHAR
- 19. Заказать VARCHAR И НОМЕР
- 20. Должен ли я использовать VARCHAR (20) или VARCHAR (255) для хранения имени?
- 21. Teradata SQL VARCHAR и пробелы
- 22. varchar и auto increment atter
- 23. VARCHAR (254) по сравнению с VARCHAR (255)
- 24. MySQL: VARCHAR (1024) vs VARCHAR (512)
- 25. PL/SQL varchar (10) to varchar (9)
- 26. SQLBase varchar col to long varchar col
- 27. LONG VARCHAR в VARCHAR Ingres DB
- 28. Ошибки Неявного преобразования значения VARCHAR в VARCHAR
- 29. Преобразование шестнадцатеричных VARCHAR в двоичный VARCHAR
- 30. найти элементы VARCHAR в другом VARCHAR
Он налагает логический * предел * (например, правило BO или «безопасность»). Пожалуйста, ищите SO - он появился раньше и вообще заканчивается в дискуссиях о пламенем. –
@rabudde: вы уверены в этом? Можете ли вы дать ссылку? Я был бы очень удивлен, если бы определенная длина была помещена в индекс vor столбца varchar (теперь 'char' - это другое дело). Никакие СУБД, которые, как я знаю, не хранят полную длину в индексе, - но тогда MySQL всегда хорош для сюрпризов. –
@pst, a_horse_with_no_name: вы правы, я был смущен другим фактом (UTF8 и индексы), и это точно так же, слишком большая длина «varchar» может привести к плохой производительности при сортировке или работе в временных таблицах (ссылка на высокопроизводительный MySQL от O'Reilly) – rabudde