Почему исторически люди используют 255 не 256 для значений полей базы данных?

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

varchar(255)

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

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

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

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

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

Изменить:

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

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

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

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

Ответ 1

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

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

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

Ответ 2

255 был предел varchar в mySQL4 и ранее.

Также 255 символов + Null terminator = 256

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

Ответ 3

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

Ответ 4

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

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

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

Поймите и сделайте выбор.

Ответ 5

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

< <

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

Ответ 10

8 бит unsigned = 256 байт

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

Ответ 11

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

Ответ 12

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

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

Есть ли недостатки в использовании общего varchar (255) для всех текстовых полей?

Ответ 13

Данные сохраняются в памяти в двоичной системе, а 0 и 1 - двоичные цифры. Наибольшее двоичное число, которое может входить в 1 байт (8 бит), равно 11111111, которое преобразуется в десятичное значение 255.