Почему я должен когда-либо выбирать длину, отличную от 255, для varchar в MySQL?

Я знаю разницу между CHAR и VARCHAR,

CHAR - фиксированная длина

VARCHAR - переменная длина (размер + 1 байт)

Но я хотел знать, в чем заключалась цель иметь возможность использовать длину varchar, например. VARCHAR(50), VARCHAR(100), VARCHAR(255)

Мне это кажется бессмысленным, потому что фактическое используемое пространство зависит от значения, хранящегося в базе данных.

Итак, мои вопросы:

1) Можно установить все мои varchar на 255 2) Зачем вам указывать любую другую длину?


person Lizard    schedule 01.07.2010    source источник
comment
возможный дубликат Есть ли недостатки использовать общий varchar (255) для всех текстовых полей?   -  person Eric Petroelje    schedule 02.07.2010
comment
Кроме того, stackoverflow.com/questions / 1262174 /   -  person Eric Petroelje    schedule 02.07.2010
comment
Всегда думал, что документация MySQL довольно хорошо объясняет разницу: dev.mysql .com / doc / refman / 5.0 / en / char.html.   -  person OMG Ponies    schedule 02.07.2010
comment
Обратите внимание, если вы добавляете индекс в свой столбец varchar: максимальная длина префикса ключа индекса InnoDB составляет 767 байт. Благодаря тому, как MySQL обрабатывает Unicode, это может еще больше уменьшить количество фактических символов, которые могут быть сохранены ... с кодировкой utf8mb4, потенциально всего до 191. Таким образом, для индексированных столбцов varchar(191), вероятно, является самой безопасной максимальной длиной. См. Документацию здесь: dev.mysql.com/doc/refman /8.0/en/innodb-limits.html   -  person Greg Kennedy    schedule 31.05.2020


Ответы (9)


1) Если вы не хотите ограничивать максимальный размер хранимого varchar, тогда да, это нормально. Что, как говорится...

2) Во многих случаях вы хотите установить верхний предел размера varchar. Допустим, вы храните список рассылки и имеете ограниченное пространство для адресной строки. Установив верхний предел для поля адреса, вы теперь позволяете базе данных устанавливать для вас максимальную длину строки адреса.

person MarkD    schedule 01.07.2010

Выдержка из документации MySQL:

Типы CHAR и VARCHAR похожи, но различаются способами их хранения и извлечения. Начиная с MySQL 5.0.3, они также различаются максимальной длиной и сохранением конечных пробелов.

Типы CHAR и VARCHAR объявлены с длиной, которая указывает максимальное количество символов, которые вы хотите сохранить. Например, CHAR (30) может содержать до 30 символов.

Длина столбца CHAR фиксируется на длине, которую вы объявляете при создании таблицы. Длина может быть любым значением от 0 до 255. Когда значения CHAR сохраняются, они дополняются справа пробелами до указанной длины. Когда значения CHAR извлекаются, конечные пробелы удаляются.

Значения в столбцах VARCHAR представляют собой строки переменной длины. Длина может быть указана как значение от 0 до 255 до MySQL 5.0.3 и от 0 до 65 535 в 5.0.3 и более поздних версиях. Эффективная максимальная длина VARCHAR в MySQL 5.0.3 и более поздних версиях зависит от максимального размера строки (65 535 байт, который распределяется между всеми столбцами) и используемого набора символов.

В отличие от CHAR, значения VARCHAR хранятся как однобайтовый или двухбайтовый префикс плюс данные. Префикс длины указывает количество байтов в значении. В столбце используется один байт длины, если для значений требуется не более 255 байтов, и два байта длины, если для значений может потребоваться более 255 байтов.

person Jauzsika    schedule 01.07.2010
comment
Помните, что при цитировании вы указываете ссылку на источник. - person OMG Ponies; 02.07.2010
comment
Небольшая поправка: в связанной документации указано, что VARCHAR имеет верхний предел 65 535 для MySQL ›= 5.0.3. Цитата: The length can be specified as a value from 0 to 255 before MySQL 5.0.3, and 0 to 65,535 in 5.0.3 and later versions. - person jweyrich; 22.10.2013

СИМВОЛ против VARCHAR

CHAR используется для переменной размера фиксированной длины.
VARCHAR используется для переменной размера переменной длины.

E.g.

create table emp
(f_name CHAR(20),
 l_name VARCHAR(20)
);

insert into emp values('Suraj','Chandak');

select length(f_name), length(l_name) from emp;

Output will be

length(f_name)          Length(l_name)
   20                       7

Лучший ответ для CHAR vs VARCHAR

Изменить

  • Вы можете установить максимальный верхний предел для столбца.
  • Производительность и объем памяти могут иметь значение.

Спасибо.

person Aniket Kulkarni    schedule 28.11.2012
comment
Вопрос в том, 1) Все мои varchar можно установить на 255 2) Почему вы хотите указывать любую другую длину?, А не CHAR vs VARCHAR. - person Davor; 18.11.2014

Таблицы фиксированной длины (статические) работают быстрее. Когда каждый столбец в таблице имеет «фиксированную длину», таблица также считается «статической» или «фиксированной длины». Примеры типов столбцов НЕ фиксированной длины: VARCHAR, TEXT, BLOB.

http://net.tutsplus.com/tutorials/other/top-20-mysql-best-practices/

Итак, если в вашей таблице нет других полей, таких как varchar, text или blob; вы можете использовать char и сделать свою таблицу статической. Так они быстрее.

person musafar006    schedule 22.11.2013
comment
Этот ответ не имеет ничего общего с заданным здесь вопросом. - person Davor; 18.11.2014
comment
и ты прав. Не помню, зачем я опубликовал этот ответ. Может, в то время я искал что-то связанное с этим. Может он свой вопрос редактировал? - person musafar006; 22.11.2014
comment
Не знаю, может быть. Я не знаю, как посмотреть его историю редактирования, и достаточно ли у меня репутации, чтобы увидеть это в первую очередь. - person Davor; 23.11.2014

1) Технически это нормально, потому что поля создаются только с 1 или 2 байтами в начале. Впоследствии они будут расти по мере необходимости.

2) Тем не менее, хорошие принципы проектирования предполагают, что вы устанавливаете длину полей соответствующим образом, чтобы data, чем другие, и б) вы можете предотвратить небольшой объем дополнительной работы, выполняемой механизмом базы данных, потому что он должен усекать меньше места из поля VARCHAR (10), чем из поля VARCHAR (255) во время вставки.

Вы можете просмотреть дополнительную информацию об этом здесь:

http://dev.mysql.com/doc/refman/5.0/en/char.html

person Community    schedule 01.07.2010

Я читал в другом месте, что varchar дает снижение производительности по сравнению с char, когда вы запускаете выборки для столбцов, определенных с ними. Итак, возможно, вы захотите выбрать char, если вы точно знаете, что поле всегда будет определенной длины, и у вас есть проблемы с производительностью ...

person Greg Gauthier    schedule 01.07.2010
comment
Я хотел бы увидеть ссылку на эту претензию. - person dotancohen; 02.12.2013
comment
Достаточно честно, и я бы дал вам один, только этот комментарий был более трех лет назад, и я даже не могу вспомнить, где я его видел. - person Greg Gauthier; 03.12.2013

Основное различие между этими двумя типами значений проявляется при сравнении строк.

В столбце CHAR, длина которого предопределена, вам придется «прогонять» всю длину столбца, в то время как в столбце VARCHAR вам нужно «прогонять» все время по всей длине значения, а не по длине столбца, что в большинстве случаев намного быстрее.

Следовательно, длина значения, которая меньше длины поля, будет сравниваться быстрее, если она сохранена в поле VARCHAR.

person Alon Kogan    schedule 19.05.2013

Но я хотел знать, в чем заключалась цель иметь возможность использовать длину varchar, например. VARCHAR (50), VARCHAR (100), VARCHAR (255)

Мне это кажется бессмысленным, потому что фактическое используемое пространство зависит от значения, хранящегося в базе данных.

Указывая, например, VARCHAR (5) вместо VARCHAR (500) может дать вам лучшую производительность в некоторых случаях, например для операций, использующих временные таблицы в памяти.

Другой случай - ограничить длину столбца в соответствии с требованиями домена (когда ваше значение не должно быть больше некоторого максимума. Пример: полное доменное имя в DNS не может превышать длину 253 символа)

person Grygoriy Gonchar    schedule 09.08.2013

1) Да.

2) Исторически это был хит производительности.

Посмотрите на базы данных, такие как sqlite, которые хранят все как текст, чтобы убедиться, что это больше не имеет значения.

person Toby Allen    schedule 01.07.2010
comment
sqlite - это не совсем высокопроизводительная база данных, а varchar снижает производительность, если заставляет размер строки быть переменным. - person qdot; 24.02.2012
comment
Да, но для большинства людей и большинства пользователей он достаточно быстрый - person Toby Allen; 26.02.2012
comment
Верно, но утверждение, что это «больше не имеет значения» и использование sqlite в качестве вершины проектирования баз данных, действительно вводит в заблуждение. И нет, для большинства людей и большинства пользователей он недостаточно быстр - его проще всего настроить, и это перевешивает затраты, по крайней мере, на начальном этапе ... пока у вас никогда не бывает одновременных запросов от более чем одного пользователя, то есть. - person qdot; 26.02.2012