У пам’яті VARCHAR(255)
досить розумно зберігати лише потрібну вам довжину в заданому рядку, на відміну від CHAR(255)
якого завжди зберігалося б 255 символів.
Але оскільки ви позначили це питання за допомогою MySQL, я згадаю підказку, що стосується MySQL: коли рядки копіюються з шару двигуна зберігання на рівень SQL, VARCHAR
поля перетворюються на те, CHAR
щоб отримати перевагу роботи з рядками з фіксованою шириною. Таким чином, рядки в пам'яті стають вичерпаними до максимальної довжини оголошеного VARCHAR
стовпця.
Коли ваш запит неявно генерує тимчасову таблицю, наприклад, під час сортування або GROUP BY
, це може використовувати багато пам'яті. Якщо ви використовуєте багато VARCHAR(255)
полів для даних, які не повинні бути такими довгими, це може зробити тимчасову таблицю дуже великою.
Можливо, вам також захочеться знати, що така поведінка "витіснення" означає, що рядок, оголошений набором символів utf8, виділяє три байти на символ навіть для рядків, які ви зберігаєте з однобайтовим вмістом (наприклад, символи ascii або latin1). І так само набір символів utf8mb4 призводить до того, що рядок має не більше чотирьох байтів на символ у пам'яті.
Таким чином, VARCHAR(255)
у utf8, що зберігає короткий рядок типу "Без думки", на диску береться 11 байт (десять символів нижньої діаграми плюс один байт на довжину), але це займає 765 байт у пам'яті, а значить, у тимчасових таблицях або відсортованих результатах.
Я допомагав користувачам MySQL, які несвідомо створювали темп-таблиці 1,5 ГБ часто і заповнювали свій дисковий простір. У них було багато VARCHAR(255)
колонок, які на практиці зберігали дуже короткі рядки.
Краще визначити стовпчик на основі типу даних, які ви збираєтесь зберігати. Це має переваги для застосування обмежень, пов’язаних із додатком, як згадували інші. Але це має фізичну користь, щоб уникнути втрати пам’яті, яку я описав вище.
Звичайно, важко дізнатися, що таке найдовша поштова адреса, саме тому багато людей вибирають довгу, VARCHAR
яка, звичайно, довша за будь-яку адресу. І 255 є звичайним, оскільки це максимальна довжина a, VARCHAR
для якої довжина може бути закодована одним байтом. Це також була максимальна VARCHAR
довжина в MySQL старше 5,0.