Страницы

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

понедельник, 10 февраля 2020 г.

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

#mysql #sql #char


  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 как-то влияет на это?



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


Ответы

Ответ 1



Циферка в скобках 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 байт, плюс один на хранение длины строки.

Ответ 2



Количество занимаемых байтов в данном случае будет на 1 больше байтового представления хранимой строки. Грубо, если в строке 2 символа однобайтовых и 2 двухбайтовых, то нужно 7 байтов. Подробнее см. на http://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html И да, если используются корейские/китайские/японские символы, то может быть и 3 байта на символ. Об этом см. http://dev.mysql.com/doc/refman/5.7/en/charset-unicode-utf8.html

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

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