Чому історично люди використовують 255, а не 256 для величин поля баз даних?


190

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

varchar(255)

Зважаючи на те, що це ємність чи величина, а не індексатор , чому 255 кращих перед 256? Чи байт зарезервований для якоїсь мети (термінатор, нуль чи щось)?

Імовірно, варчар (0) - це нісенітниця (має нульову ємність)? У якому випадку 2 ^ 8 простору повинно бути 256?

Чи існують інші масштаби, які забезпечують ефективність роботи? Наприклад, чи менш варчар (512) менш ефективний, ніж варчар (511) або варчар (510)?

Чи однакове це значення для всіх баз даних відносин, старих і нових?

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

Редагувати:

Дякую за відповіді, мабуть, існує певне визнання, що байт використовується для зберігання розміру, але це не вирішує цю проблему остаточно.

Якщо метадані (довжина рядка) зберігаються в одній суміжній пам'яті / диску, це має певний сенс. 1 байт метаданих та 255 байт рядкових даних дуже добре підійдуть між собою та вписуються в 256 суміжних байтів сховища, що, імовірно, є акуратним та охайним.

Але ... Якщо метадані (довжина рядка) зберігаються окремо від фактичних даних рядка (можливо, у головній таблиці), то для обмеження довжини даних рядка на один байт, тільки тому, що простіше зберігати лише ціле число 1 байт метаданих здається трохи дивним.

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


3
Оскільки кількість символів починається від 0 до N-1. Так 256 символів буде оголошено варчаром (255). Якщо я не помиляюся.
Buhake Sindi

3
Може тому, що ІТ-люди починають рахувати з 0, а не 1;)?
Ромен Лінсолас

Я думаю, що це стосується програмістів старої школи, я навіть не пам'ятаю, чому ми це зробили.
Стурботний

7
@Elite Джентльмен: ні, число в дужках - це справжня довжина ... Як і в оголошеннях масиву C: x [256] дає x [0] ... x [255].
RedPandaCurios

@romaintaz - але розглянемо масив, який може зберігати 1 елемент. Ви декларуєте це щось [1] та отримуєте доступ до нього щось [0]. Питання в тому, чому в SQL ми оголошуємо ємність на 1 байт менше, ніж здається логічною на перший погляд.
Ендрю М

Відповіді:


167

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

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

Як зазначаєте, це історична оптимізація і, мабуть, не стосується більшості систем сьогодні.


Зарезервувати байт на довжину має сенс, але WRT ваш другий парагрф, імовірно, a / value / of length zero є дійсним, але чи є / ємність / довжина нуля дійсна?
Ендрю М

1
@Andrew: Я щойно спробував і PostgreSQL відкидає varchar(0). Це, мабуть, не так корисно, оскільки значенням можуть бути лише дві речі, порожній рядок або NULL, і тому ви можете просто використовувати bitдля цього.
Грег Х'югілл

Тож правда припустити, що метадані ємності зберігаються в тому ж суміжному блоці, що і самі дані, і тому БД має перевагу зберігати загальну кількість цих двох речей (даних та метаданих) на одній сторінці (імовірно, 256 байт)?
Ендрю М

@Andrew: Це припущення, яке може бути, а може бути істинним, залежно від деталей про реалізацію відповідної СУБД. Розміри сторінки, як правило, набагато перевищують 256 байт. Як я вже згадував, такий тип оптимізації іноді важливий (наприклад, якщо ви зберігаєте мільярди невеликих рядків), але більшість часу про це не варто турбуватися.
Грег Х'югілл

3
Важливість простору на диску (та просторі індексу) полягає не в тому, що 256 може розміщуватися на сторінці, а тому, що 1 байт проти 2 байтів (для мільйонів / мільярдів / трильйонів рядків) має велику різницю.
ypercubeᵀᴹ

35

255 був обмеженням varchar у mySQL4 та більш ранніх версіях.

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

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


І читання char foo[256]важливе, тому що управління пам’яттю любить повноваження 2. див.: Stackoverflow.com/questions/3190146/… Розподіл char foo[257]буде або фрагмент пам'яті, або займе 512 байт.
ebyrob

4
Чи не вархар зберігає довжину рядка, і тому не потрібен нульовий термінатор?
Cruncher

19

255 - це найбільше числове значення, яке може бути збережене в однобайтовому цілому цілому (маючи на увазі 8-бітові байти) - отже, додатки, які зберігають довжину рядка для певної мети, віддають перевагу 255 над 256, оскільки це означає, що вони повинні лише виділіть 1 байт для змінної "size".


17

З посібника з MySQL:

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

Необхідне зберігання:
L + 1 байт, якщо для значень стовпців потрібні 0 - 255 байт, L + 2 байти, якщо значень може вимагати більше 255 байт

Зрозумійте і зробіть вибір.


Так, але M represents the declared column length in characters for nonbinary string types and bytes for binary string types. L represents the actual length in bytes of a given string value. dev.mysql.com/doc/refman/5.7/uk/storage-requirements.html
DLight


7

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

Але якщо ви дозволяєте в полі зберігати текстові рядки нульової довжини, вам потрібно мати можливість зберігати нуль у довжині. Таким чином, ви можете дозволити 256 чітких значень довжини, починаючи з нуля: 0-255.


6

Часто вархари реалізуються у вигляді рядків pascal: тримаючи фактичну довжину в байті № 0. Тому довжина була обмежена до 255. (Значення байту коливається від 0 до 255).


5

<<

Згадавши основи зберігання біт / байтів, йому потрібен один байт для зберігання цілих чисел нижче 256 і два байти для будь-якого цілого числа між 256 і 65536. Отже, для зберігання 511 або 512 або для цього питання 65535 потрібно однаковий простір (два байти). .... Таким чином, зрозуміло, що цей аргумент, згаданий у обговоренні вище, є N / A для varchar (512) або varchar (511).


4

8 біт без підпису = 256 байт

255 символів + байт 0 на довжину


3

Раніше було те, що для всіх рядків потрібен термінал NUL або "зворотна косої риски". Оновлених баз даних цього немає. Це було "255 символів тексту" з "\ 0", доданим автоматично в кінці, щоб система знала, де закінчується рядок. Якби ви сказали VARCHAR (256), це в кінцевому рахунку буде 257, і тоді ви будете в наступному реєстрі для одного символу. Марно. Тому все було VARCHAR (255) та VARCHAR (31). За звичкою 255, схоже, застрягли, але 31 рік став 32-м, а 511 - 512-м. Ця частина дивна. Важко змусити себе написати VARCHAR (256).


0

Я думаю, це може відповісти на ваше запитання. Схоже, це було максимальне обмеження варшара в попередніх системах. Я зняв це з іншого питання про stackoverflow.

Звичайно, важко дізнатися, що таке найдовша поштова адреса, саме тому багато людей обирають довгий VARCHAR, який, звичайно, довший за будь-яку адресу. І 255 є звичайним, оскільки це можливо було максимальною тривалістю VARCHAR в деяких базах даних на світанку часу (як і PostgreSQL до недавнього часу).

Чи є недоліки використання загального варшара (255) для всіх текстових полів?


0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.