Есть ли веская причина, по которой я вижу, что VARCHAR (255) используется так часто (в отличие от другой длины)?

158

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

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


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

койка
источник

Ответы:

109

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

хаос
источник
4
@CharlesBretana: если вы прочитаете оставшуюся часть предложенного вами предложения, вы найдете точное объяснение, которое вы запрашиваете.
хаос
2
@CharlesBretana: Под «поддельным UTF-8» я подразумеваю кодировку MySQL «utf8», которая, как я уже говорил, резервирует (и ограничивается) 3 байта на символ. Это не очень хорошая версия UTF-8; если вы хотите приличный UTF-8 в MySQL, вы должны использовать его кодировку "utf8mb4". Но люди с гораздо большей вероятностью не знают об этом и предпочитают использовать utf8, и гораздо чаще хотят использовать UTF-8, чем любую другую кодировку, поэтому, в итоге, они получают максимальную индексируемую длину в 255 символов в VARCHAR. Ваше изумление, несмотря на.
хаос
3
@CharlesBretana: теперь я объяснил это три раза, и ничего не изменилось. Ограничение длины индекса MySQL по-прежнему составляет 767 байт, количество байтов, необходимое для кодирования 3-байтового символа UTF-8, равно 3, а floor (767/3) по-прежнему составляет 255. Ваша решимость найти что-то, что следует путать с убеждением нищих ,
хаос
1
@CharlesBretana (извините за опоздание на всю эту вечеринку) Я не специалист по БД, но я думаю, что хаос говорит: да, столбец «Fake UTF-8» может иметь длину более 255 символов, но индекс будет работать только с первыми 255 символами varchar, что делает его максимально максимальным столбцом, если вы хотите, чтобы он был полностью проиндексирован. Теперь это только то, что я понял из его объяснений, я могу ошибаться, я вообще не эксперт по индексам SQL.
Фрэнсис Лорд
2
@CharlesBretana Если вы внимательно посмотрите на ответ Хаоса, вы заметите, что он разделен на 2 части: 1. Историческая причина, по которой Varchar (255) был настолько распространен (раньше это было максимумом в некоторых старых СУБД), 2. Даже сегодня это все еще является ограничением для некоторых из-за ограничений индекса, обсужденных ранее, части 1 и 2 не связаны. Часть 1 является фактическим ответом на вопрос, часть 2 является дополнительной запиской, которая все еще имеет отношение к вопросу, потому что она объясняет, почему даже сегодня это все еще может быть ограничением. (Продолжение ->)
Фрэнсис Лорд
161

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

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

Роберт Харви
источник
90
Мне нравится эта фраза: «легкомысленно требовать еще одного целого байта». =)
MusiGenesis
7
Верно ли это для БД, где varchars - UTF-8?
Антак
1
@antak: В MySQL, используя InnoDB, любой ключевой столбец не может быть больше 767 байт. Если столбец VARCHAR имеет UTF8 (то есть каждый символ может занимать до 3 байтов), максимально допустимая длина столбца равна floor (767/3) = 255. Я предполагаю, что именно по этой причине было выбрано "767".
BlueRaja - Дэнни Пфлюгофт
1
Если кодировка равнаutf8 , varchar(85)это предел, по которому пересечение опрокидывает длину байта от одного до двух байтов. Если это так utf8mb4, то это varchar(63). Это важно, потому что это максимум, на который можно увеличить длину VARCHAR с помощью онлайн-ALTER TABLE . Следовательно, я получил эти числа, создав таблицу со varchar(2) charset utf8столбцом и посмотрев, насколько мне удалось ее расширить ALGORITHM=INPLACE.
Антак
Это имеет еще больший смысл, если учесть, что многие «базы данных» Back In The Day хранились на магнитной ленте. Очень часто считывали данные в «блоках», размер которых был кратен двум. Таким образом, данные хранились наиболее эффективно (а когда вы работали на старом мэйнфрейме, такая небольшая эффективность была оптимизацией «сделай или разбей»).
TMN
23

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

Чарльз Бретана
источник
8
+1 за цитирование конкретных баз данных и версий. И «Старые привычки умирают усердно», вероятно, самый верный ответ из всех.
Андрей М
17

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

MusiGenesis
источник
1 байт из 255 составляет 0,4%. Иногда вы заботитесь о последних полпроцента или около того. Иногда нет. Если ваши расходы на хостинг и услуги превышают десятки долларов, вам, вероятно, все равно. Если они сталкиваются с миллионами, они, вероятно, делают.
Эдвард Брей,
2
@ EdwardBrey: если закон Мура все еще остается в силе, мой ответ здесь в 16 раз более действителен, чем когда я его написал.
MusiGenesis
Если мы не обнаружили в 16 раз больше способов, которыми компьютеры могут помочь нам. Скорость по-прежнему особенность.
Эдвард Брей
14

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

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

Это помогает?

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

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

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

Стефано Борини
источник
3
Это утверждение не относится ко всем базам данных. многие базы данных используют поля varchar заданного размера в таблицах, чтобы им не приходилось перемещать строки при изменении этого поля для строки.
SingleNegationElimination
да ты прав. это зависит от реализации. Вы должны проверить руководство продавца, чтобы увидеть, в чем дело
Стефано Борини
2
Это может быть допустимо, но реализация VARCHARэтого способа сводит на нет весь смысл использования VARCHARвместо CHAR.
апреля
4

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

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

gahooa
источник
4

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

Хоакин Монтес
источник
2

0000 0000 -> это 8-битное двоичное число. Цифра представляет бит.

Вы считаете так:

0000 0000 → (0)

0000 0001 → (1)

0000 0010 → (2)

0000 0011 → (3)

Каждый бит может иметь одно из двух значений: включено или выключено. Общее наибольшее число может быть представлено умножением:

2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 - 1 = 255

Или

2^8 - 1. 

Мы вычитаем один, потому что первое число равно 0.

255 может содержать немало (не каламбур) значений.

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

ScottyBlades
источник
1

Другая причина может заключаться в том, что в очень старых библиотеках доступа к данным в Windows, таких как RDO и ADO (COM-версия, а не ADO.NET), вам пришлось вызывать специальный метод GetChunk, чтобы получить данные из столбца с более чем 255 символами. Если вы ограничили столбец varchar значением 255, этот дополнительный код не понадобился.

Booji Boy
источник