Ограничение по размеру MySQL VARCHAR
Если у меня есть столбец в таблице с полем типа VARCHAR(15)
, и если я попытаюсь вставить данные длиной 16, MySQL дает сообщение об ошибке
Data too long for column 'testname' at row 1
Кто-нибудь знает, почему поля VARCHAR в MySQL занимают фиксированную длину? Также, сколько байтов занимает поле VARCHAR для записи на основе указанного размера?
Ответы
Ответ 1
Если вы устанавливаете столбец varchar(15)
, допустимые максимальные байты равны 15. Таким образом, вы не можете передать более 15 символов без изменения столбца для поддержки более 15. Если вы храните строку из 4 символов, она должна используйте только 4 байта из возможных 15, тогда как если бы вы использовали char(15)
, он заполнил бы остальные 11 пустыми байтами.
http://dev.mysql.com/doc/refman/5.0/en/char.html
(Мой байтовый расчет был, вероятно, выключен, так как он всегда -1/+ 1 или что-то в этом роде).
Ответ 2
Из Руководство MySQL 5.0:
Значения в столбцах VARCHAR представляют собой строки переменной длины. Длина может быть указана как значение от 0 до 255 до MySQL 5.0.3 и от 0 до 65535 в 5.0.3 и более поздних версиях. Эффективная максимальная длина VARCHAR в MySQL 5.0.3 и более поздних версиях зависит от максимального размера строки (65 535 байт, которая распределяется между всеми столбцами) и используемого набора символов.
Я использую только VARCHAR, когда я уверен, что данные, которые должен содержать столбец, никогда не будут превышать определенную длину, и даже тогда я осторожен. Если я храню текстовую строку, я использую один из типов TEXT.
Ознакомьтесь с Требованиями к хранению MySQL для получения дополнительной информации о том, как используются байты.
Ответ 3
Небольшая дополнительная локальная заметка. Количество используемых байтов будет зависеть от используемой схемы кодирования. 1 байт на символ в кодировке latin1, но до 3 в UTF8. Подробнее см. Ссылку в файле mlambie.
Ответ 4
Если вы посмотрите здесь, он должен рассказать вам все о варчаре, который вы хотите знать:
http://dev.mysql.com/doc/refman/5.0/en/char.html
В принципе, в зависимости от выбранной вами длины он будет использовать 1 или два байта для отслеживания длины текущей строки в этом столбце, поэтому он будет хранить количество байтов для данных, которые вы вставляете, плюс один или два байта.
Итак, если вы введете 'abc', то для этого столбца в этой строке будет 4 или 5 байтов.
Если вы использовали char(15)
, тогда даже "abc" будет занимать 15 байт, так как данные будут правильно дополнены, чтобы использовать до 15 байт.