ВАРЧАРЫ: 2, 4, 8, 16 и т. Д.? Или 1, 3, 7, 15 и т. Д.?

Я вижу, что VARCHAR (255) все время используется вместо VARCHAR (256), но я также вижу, что VARCHAR (16) используется вместо VARCHAR (15). Мне это кажется непоследовательным. Если для хранения длины VARCHAR используется дополнительный байт, разве это правило не должно применяться к меньшим длинам, таким как 2, 4, 8, вместо 1, 3, 7?

Или я чего-то совсем упускаю?

Другими словами, если у меня есть число, которое, как я знаю, никогда не будет выше 12, следует ли мне просто пойти дальше и использовать вместо этого VARCHAR (15) или VARCHAR (16)? Потому что он использует то же пространство, что и VARCHAR (12)? Если да, то какой мне использовать? 15 или 16? Меняется ли это правило вообще, когда я приближаюсь к 256?

Я использую как MySQL, так и SQL, в зависимости от проекта.


person Community    schedule 03.08.2009    source источник


Ответы (3)


Другими словами, если у меня есть число, которое, как я знаю, никогда не будет выше 12, следует ли мне просто пойти дальше и использовать вместо этого VARCHAR (15) или VARCHAR (16)?

Нет! Используйте varchar (12) (или, возможно, даже char (12), если длина довольно постоянна).

Когда-то в некоторых системах тип varchar был ограничен 255 символами (включая MySql ранее до 5.0.3), поскольку первый сохраненный байт указывает длину поля. Учитывая это ограничение, разработчики, желающие разрешить разумный объем текста, выбрали бы 255, а не переходили бы к другому типу данных в целом.

Но если вы знаете размер ваших данных, определенно используйте именно этот размер для базы данных.

person Community    schedule 03.08.2009
comment
Спасибо. Все ответы были полезны, но мне пришлось выбрать один. - person jedmao; 03.08.2009
comment
@geocar: Если языковой стандарт вашей базы данных настроен правильно, VARCHAR(12) будет содержать 12 символов. VARCHAR учитывает регион - person Andrew Moore; 03.08.2009

Это не имеет ничего общего с нечетными или четными числами.

Исторически 255 символов часто были максимальной длиной VARCHAR в различных СУБД. Предел длины для поля, которое тогда не было LOB (большим объектом), составляло 255 байтов (1 байт int). Таким образом, первый байт использовался для хранения длины поля (0–255), а оставшиеся n байта - для символов. Вот почему вы часто видите VARCHAR(255).

Если поле никогда не будет больше 12, используйте VARCHAR(12).

person Community    schedule 03.08.2009
comment
Причина 255 в том, что когда вы используете первый байт для хранения длины поля, этот 8-битный байт может указывать только длины от 0 до 255. - person Joel Coehoorn; 03.08.2009
comment
@ Джоэл: Верно, просто не хотел вдаваться в семантику. Я отредактировал свой ответ. - person Andrew Moore; 03.08.2009

Я думаю, что исходная проблема заключается в том, что для некоторых систем VARCHAR (...) был ограничен 255, потому что, когда вы используете один байт для кодирования фактической длины, вы можете выражать длины только до 255.

VARCHAR (16) / VARCHAR (15), скорее всего, напоминает об этом происхождении, но в этих двух значениях нет ничего особенного.

person Community    schedule 03.08.2009
comment
Я думаю, что во многом причина, по которой вы видите 15 и 16, заключается в том, что программисты думали, что они оптимизируют, но в конечном итоге запутали будущих программистов относительно их намерений. - person cdmckay; 03.08.2009
comment
LOL, это именно то, о чем я думал! И это сработало! Это полностью сбило меня с толку. Спасибо! - person jedmao; 03.08.2009