CHAR(n)- фіксованої довжини: значення доповнюється пробілами доnсимволів при збереженні, а при читанні кінцеві пробіли прибираються.VARCHAR(n)- змінної довжини: зберігається рівно стільки символів, скільки записано, плюс 1-2 байти на довжину.
CREATE TABLE codes (
country CHAR(2), -- завжди 2 символи: 'UA', 'PL'
email VARCHAR(255) -- від 0 до 255 символів
);
Коли CHAR: значення завжди однакової довжини - коди країн і валют, хеші фіксованої довжини, коди статусів. Тоді немає зайвих байтів на довжину.
Коли VARCHAR: усе інше - імена, email, адреси, заголовки.
Нюанси:
n- у символах, а не байтах. Вutf8mb4символ займає до 4 байтів, тожVARCHAR(255)- до 1020 байтів даних. Це важливо для обмежень розміру рядка таблиці й індексу.CHARвutf8mb4у InnoDB займає змінну кількість байтів, тож перевага «фіксованої довжини» для багатобайтових кодувань майже зникає.- Кінцеві пробіли:
CHARвтрачає їх при читанні; дляVARCHARвони зберігаються, але порівняння в collations зPAD SPACEїх ігнорують ('a' = 'a '- істина). Collationsutf8mb4_0900_*у MySQL 8 -NO PAD, і там пробіли значущі. - Обмеження
n:VARCHARдо 65 535 байтів, але всі колонки рядка разом не можуть перевищити 65 535 байтів - довгі тексти виносять уTEXT.
VARCHAR(255) за звичкою - нормально як верхня межа, але для полів з відомим обмеженням (телефон, код) варто ставити реальну довжину: це й документація, і захист від сміття. Валідація довжини все одно потрібна й у застосунку, щоб користувач отримав зрозуміле повідомлення.