#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
Комментариев нет:
Отправить комментарий