2009-08-01 9 views
105

В нескольких курсах, книгах и заданиях я видел текстовые поля, определенные как VARCHAR (255), как тип по умолчанию для «короткого» текста. Есть ли веская причина, что длина 255 выбрана так часто, за исключением a nice round number? Является ли это задержанием с какого-то времени в прошлом, когда была веская причина (независимо от того, применяется ли она сегодня)?Есть ли веская причина, я вижу, что VARCHAR (255) используется так часто (в отличие от другой длины)?

Я понимаю, конечно, что более жесткий предел был бы более идеальным, если бы вы как-то знали максимальную длину строки. Но если вы используете VARCHAR (255), это, вероятно, указывает на то, что вы не знаете максимальную длину, только то, что это «короткая» строка.


Примечание: Я нашел этот вопрос (varchar(255) v tinyblob v tinytext), который говорит, что УАКСНАК (п) требует п + 1 байт памяти для п < = 255, п +2 байтов хранение для n > 255. Это единственная причина? Это кажется произвольным, поскольку вы сохранили бы только два байта по сравнению с VARCHAR (256), и вы могли бы легко сохранить еще два байта, объявив его VARCHAR (253).

ответ

67

Исторически 255 символов часто были максимальной длиной VARCHAR в некоторых СУБД, и иногда она по-прежнему является эффективным максимумом, если вы хотите использовать UTF-8 и индексировать столбец (из-за ограничений длины индекса).

+0

ms доступ предполагает эту длину по умолчанию, например, –

+0

«завершает работу, являясь эффективной максимальной длиной varchar ...». Какое оправдание для этого? Если бы вы упустили это слово, я бы купил его этим словом, вы подразумеваете, что в тех СУБД, на которые вы ссылаетесь, вы можете иметь большие столбцы, но они неэффективны. это неправда. - Я даже не уверен, что это значит. –

+2

@CharlesBretana: если вы прочтете остальную часть предложения, которое вы указали, вы найдете точное объяснение, которое вы запрашиваете. – chaos

125

255 используется потому, что это максимальное количество символов, которое можно пересчитать с помощью 8-битного номера. Он максимизирует использование 8-битного подсчета без излишне требовательного другого байта для подсчета символов выше 255.

При использовании этого способа VarChar использует только количество байтов + 1 для хранения вашего текста, поэтому вы можете а также установите его на 255, если вы не хотите установить жесткий лимит (например, 50) на количество символов в поле.

+70

Мне нравится эта фраза: «легкомысленно требуя еще одного целого байта». =) – MusiGenesis

+6

Это верно для DB, где varchars - UTF-8? – antak

+0

Это хороший вопрос. –

3

Число байтов без знака 1 может содержать диапазон [0-255] включительно. Итак, когда вы видите 255, в основном потому, что программисты думают в базе 10 (получите шутку?) :)

На самом деле, на какое-то время 255 был самым большим размером, который вы могли бы дать VARCHAR в MySQL, и есть преимущества использовать VARCHAR над текстом с индексацией и другими проблемами.

15

Возможно, потому что и SQL Server, и Sybase (для обозначения двух, с которыми я знаком) используются, чтобы иметь максимум 255 символов в количестве символов в столбце VARCHAR. Для SQL Server это изменилось в версии 7 в 1996/1997 годах или так ... но старые привычки иногда сильно умирают.

+3

+1 для цитирования конкретных БД и Версии. И «Старые привычки умирают тяжело», вероятно, самый верный ответ. –

12

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

+0

1 байт из 255 - 0,4%. Иногда вы заботитесь о последних полутора процентах или около того. т. Если вы занимаетесь хостингом и первыми затратами на десятки долларов, вам, вероятно, все равно. Если они столкнутся с t он миллионы, они, вероятно, делают. –

+0

@EdwardBrey: если закон Мура все еще держится правдой, мой ответ здесь в 16 раз более достоверен, чем когда я его написал. – MusiGenesis

+0

Если мы не обнаружили в 16 раз больше способов, которые могут нам помочь компьютеры. Скорость все еще является особенностью. –

6

Примечание: Я нашел этот вопрос (VARCHAR (255) против TINYBLOB против TINYTEXT), , который говорит, что VARCHAR (п) требует п + 1 байт памяти для п < = 255, п + 2 байтов хранения для n> 255. Является ли это единственной причиной? Это похоже на , так как вы могли бы только сэкономить два байта по сравнению с VARCHAR (256), и вы могли бы так же, как легко сохранить еще два байта на , объявив его VARCHAR (253).

No. вы не сохраните два байта, объявляя 253. Реализация VARCHAR, скорее всего, счетчик длины и переменной длины, nonterminated массив. Это означает, что если вы храните «привет» в varchar (255), вы будете занимать 6 байтов: один байт для длины (число 5) и 5 ​​байтов для пяти букв.

+2

Это утверждение не относится ко всем базам данных. многие базы данных используют поля varchar данного размера в таблицах, поэтому им не нужно перемещать строки вокруг, когда это поле изменяется для строки. – SingleNegationElimination

+0

да, вы правы. это зависит от реализации. Вы должны проверить руководство продавца, чтобы узнать, что это такое. –

+2

Это допустимо, но реализация 'VARCHAR' таким образом побеждает целую * точку * использования' VARCHAR' вместо 'CHAR'. – dan04

3

Во многих приложениях, таких как MsOffice (до версии 2000 или 2002), максимальное количество символов на ячейку составляло 255. Перенос данных из программ, способных обрабатывать более 255 символов в поле в/из этих приложений, был кошмаром. В настоящее время предел все меньше и меньше препятствует.

8

Когда вы говорите 2^8, вы получаете 256, но цифры в терминах компьютеров начинаются с номера 0. Итак, вы получили 255, вы можете исследовать его в маске интернета для IP или самого IP.

255 максимальное значение 8 битное целое: 11111111 = 255

ли это помощь?

+1

С целыми числами вы считаете, начиная с 0 и заканчивая на 255. Но с местами в строке вы считаете, начиная с 1-го места, так что не имеет смысла заканчиваться на 256-м месте, потому что вы начали с 1 вместо 0? Я не согласен с varchar (256) полностью только пока, из-за результатов string_length(), но я действительно не уверен. – HoldOffHunger