Страницы

Поиск по вопросам

суббота, 20 апреля 2019 г.

Количество сколько байтов в поле mysql таблицы

CREATE TABLE `NewTable` ( `usname` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8 COLLATE=utf8_bin ROW_FORMAT=COMPACT ;
Если в поле будут введены не utf-8 символы, то максимум 32 символа можно хранить в этом поле.
А если в поле будут utf-8 символы, то и utf-8 можно 32 шт сохранять в этом поле.
Сколько байт будет занимать поле если в нем только utf-8 символы?
И сколько байт, если на utf-8 символы будут хранится в нем?
Режим traditional как-то влияет на это?

Изменил заголовок: добавил слово "сколько" - для автопоиска, если кто-то будет задавать схожий вопрос.


Ответ

Циферка в скобках varchar указывает именно число символов используемой кодировки. Длина в байтах напрямую зависит от используемой для поля кодировки CHARACTER SET
Для utf8 mysql использует максимум 3-байтовое представление. Поэтому varchar(32) будет занимать до 3 * 32 = 96 байт сами данные, плюс 1 или 2 байта на хранение длины данных в байтах. 96 меньше 255, поэтому требуется 1 байт. Итого такой varchar будет занимать от 1 до 97 байт на диске.
Интересный момент, что в индексе и всяких сортировках/группировках в памяти это поле всегда развёрнуто до максимальной байтовой длины.
Внимательный читатель может удивиться ещё одному моменту - ведь utf может занимать до 4 байт. А mysql под utf8 умеет хранить только 3 байта. Да, utf8 в остальном мире и utf8 в mysql - разные вещи. При попытке записать 4-байтный utf8 (именно в 4 байте размещены модные нынче смайлики, т.е. это совсем не экзотика мёртвых языков, а реально встречаемые данные) mysql вернёт ошибку и ничего не запишет. Для полноценного utf8 в mysql 5.5 добавлена кодировка utf8mb4
А utf8mb4 использует уже до 4 байт на символ. Что немного изменяет результат байтовой длины: 32 символа будут занимать до 32*4 = 128 байт, плюс один на хранение длины строки.

Комментариев нет:

Отправить комментарий