Почему исторически люди используют 255, а не 256 для величин полей базы данных? - PullRequest
173 голосов
/ 26 февраля 2010

Вы часто видите, что поля базы данных имеют величину 255 символов. Какова традиционная / историческая причина, почему? Я предполагаю, что это связано с ограничениями подкачки / памяти и производительностью, но различие между 255 и 256 меня всегда смущало.

varchar(255)

Учитывая, что это емкость или величина, не индексатор , почему 255 предпочтительнее 256? Зарезервирован ли байт для какой-либо цели (терминатор или ноль или что-то)?

Предположительно, varchar (0) - нонсенс (имеет нулевую емкость)? В каком случае 2 ^ 8 места должно быть 256 обязательно?

Существуют ли другие величины, обеспечивающие повышение производительности? Например, varchar (512) менее эффективен, чем varchar (511) или varchar (510)?

Является ли это значение одинаковым для всех баз данных отношений, старых и новых?

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

Edit:

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

Если метаданные (длина строки) хранятся в одной и той же смежной памяти / диске, это имеет некоторый смысл. 1 байт метаданных и 255 байт строковых данных очень хорошо подходят друг другу и помещаются в 256 смежных байтов памяти, что, по-видимому, аккуратно и аккуратно.

Но ... Если метаданные (длина строки) хранятся отдельно от фактических строковых данных (возможно, в основной таблице), то ограничить длину строковых данных одним байтом только потому, что проще хранить только 1-байтовое целое число метаданных кажется немного странным.

В обоих случаях это может показаться тонкостью, которая, вероятно, зависит от реализации БД. Практика использования 255 кажется довольно распространенной, поэтому кто-то где-то, должно быть, вначале аргументировал это хорошим аргументом, может кто-нибудь вспомнить, что это был за случай? Программисты не примут никакой новой практики без причины, и это, должно быть, когда-то было новым.

Ответы [ 12 ]

155 голосов
/ 26 февраля 2010

При максимальной длине 255 символов СУБД может выбрать использование одного байта для указания длины данных в поле. Если бы ограничение было 256 или больше, понадобилось бы два байта.

Значение нулевой длины, безусловно, действительно для данных varchar (если не указано иное). Большинство систем рассматривают такую ​​пустую строку как отличную от NULL, но некоторые системы (особенно Oracle) обрабатывают пустую строку идентично NULL. Для систем, где пустая строка не равна NULL, потребуется дополнительный бит где-то в строке, чтобы указать, следует ли считать значение NULL или нет.

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

31 голосов
/ 26 февраля 2010

255 был пределом varchar в mySQL4 и более ранних версиях.

Также 255 символов + нулевой терминатор = 256

Или дескриптор длины в 1 байт дает возможный диапазон 0-255 символов

18 голосов
/ 26 февраля 2010

255 - это наибольшее числовое значение, которое может быть сохранено в однобайтовом целом числе без знака (при условии 8-битных байтов) - следовательно, приложения, которые для какой-то цели хранят длину строки, предпочтут 255 вместо 256, потому что нужно только выделить 1 байт для переменной "size".

14 голосов
/ 05 июля 2012

Из руководства MySQL:

Тип данных:
VARCHAR (M), VARBINARY (M)

Требуется хранилище:
L + 1 байт, если значения столбца требуют 0 - 255 байт, L + 2 байта, если значения могут требовать более 255 байт

Понять и сделать выбор.

13 голосов
/ 26 февраля 2010

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

7 голосов
/ 26 февраля 2010

Максимальная длина 255 позволяет ядру базы данных использовать только 1 байт для хранения длины каждого поля. Вы правы, что 1 байт пространства позволяет хранить 2 ^ 8 = 256 различных значений для длины строки.

Но если вы разрешите полю хранить текстовые строки нулевой длины, вы должны иметь возможность хранить нулевую длину. Таким образом, вы можете разрешить 256 различных значений длины, начиная с нуля: 0-255.

6 голосов
/ 26 февраля 2010

Часто varchars реализованы в виде строк паскаля: содержат фактическую длину в байте # 0. Следовательно, длина была ограничена 255. (Значение байта варьируется от 0 до 255.)

5 голосов
/ 03 июля 2014

Вспомнил основы хранения битов / байтов, требуется один байт для хранения целых чисел ниже 256 и два байта для любого целого числа от 256 до 65536. Следовательно, для хранения 511, 512 или 65535 требуется одно и то же пространство (два байта). Таким образом, ясно, что аргумент this, упомянутый в обсуждении выше, не применяется для varchar (512) или varchar (511).

4 голосов
/ 26 февраля 2010

8 бит без знака = 256 байт

255 символов + байт 0 для длины

3 голосов
/ 16 июля 2015

Раньше для всех строк требовался терминатор NUL или «обратный слеш-ноль». Обновленные базы данных не имеют этого. Это было «255 символов текста» с автоматически добавленным «\ 0» в конце, чтобы система знала, где заканчивается строка. Если бы вы сказали VARCHAR (256), в итоге получилось бы 257, и тогда вы оказались бы в следующем регистре для одного символа. Расточительное. Вот почему все было VARCHAR (255) и VARCHAR (31). По привычке 255, кажется, застряли, но 31-й стал 32-м, а 511-й стал 512-м. Эта часть странная. Трудно заставить себя написать VARCHAR (256).

...