Ограничение размера MySQL VARCHAR

Если у меня есть столбец в таблице с полем типа VARCHAR(15) и если я пытаюсь вставить данные длиной 16, MySQL выдает сообщение об ошибке

Data too long for column 'testname' at row 1

Кто-нибудь знает, почему поля VARCHAR в MySQL имеют фиксированную длину? Также сколько байтов занимает поле VARCHAR на запись в зависимости от заданного размера?


person MySQL DBA    schedule 20.10.2009    source источник
comment
@Camilo - Притворяйся, пока не получится!   -  person Ben    schedule 24.05.2013


Ответы (4)


Если вы установите для столбца значение varchar(15), максимально допустимое количество байтов равно 15. Таким образом, вы не можете передать ему более 15 символов без изменения столбца для поддержки более 15. Если вы сохраняете строку из 4 символов, она должна использовать только около 4 байтов. из возможных 15, тогда как если бы вы использовали char(15), остальные 11 были бы заполнены пустыми байтами.

http://dev.mysql.com/doc/refman/5.0/en/char.html

(Мое вычисление байтов, вероятно, было отключено, так как оно всегда -1/+1 или что-то в этом роде).

person meder omuraliev    schedule 20.10.2009
comment
Спасибо. Что ж, в моем случае я действительно не уверен, какова будет длина поступающих данных. Они могут быть длинными или маленькими. если быть более точным: если я указал столбец как Varchar(100), то данные могут состоять из 100 или 50 символов. Просто чтобы прояснить мое понимание. Вы имеете в виду, что он будет действовать только как тип данных CHAR. Я имею в виду, потребуется ли для каждой записи полные 100 байт или только вставленные 50 байт. Также в других СУБД. Если я не указал ограничение varchar или даже после указания ограничения, это позволяет мне вставлять больше символов, чем это. Возможно ли это в MYSQL. - person MySQL DBA; 20.10.2009
comment
Если вы установите его на varchar(100), а ваши данные в строке будут состоять из 50 символов, то он будет использовать только половину этого, он не действует как char, который заполняет оставшиеся байты. - person meder omuraliev; 20.10.2009
comment
Спасибо, но невозможно вставить более 100 байтов в столбец varchar (100). Извините, что снова и снова задаю один и тот же вопрос. Но я хочу быть очень уверенным, прежде чем устанавливать какой-либо размер столбца. Еще раз спасибо. - person MySQL DBA; 20.10.2009
comment
Максимальное значение для varchar равно 255. Если вы храните большие объемы данных, попробуйте что-то вроде TEXT вместо VARCHAR. - person meder omuraliev; 20.10.2009
comment
Varchar составляет 65 535 макс. Чар 255 макс. также я не могу использовать Text. - person MySQL DBA; 20.10.2009
comment
Я не уверен, почему это так сложно. Просто установите varchar на сумму, которую, по вашему мнению, она не превзойдет. - person meder omuraliev; 20.10.2009
comment
ну это моя проблема. Я понятия не имею, какой будет размер столбца. Но спасибо за ваши быстрые ответы. - person MySQL DBA; 20.10.2009
comment
Это жалуется, потому что режим mysql строгий? - person dtakis; 22.04.2013

Из Руководства по MySQL 5.0:

Значения в столбцах VARCHAR представляют собой строки переменной длины. Длина может быть указана как значение от 0 до 255 до MySQL 5.0.3 и от 0 до 65 535 в 5.0.3 и более поздних версиях. Эффективная максимальная длина VARCHAR в MySQL 5.0.3 и более поздних версиях зависит от максимального размера строки (65 535 байт, который используется всеми столбцами) и используемого набора символов.

Я использую VARCHAR только тогда, когда я уверен, что данные, которые должен содержать столбец, никогда не превысят определенной длины, и даже в этом случае я осторожен. Если я сохраняю текстовую строку, я обычно использую один из типов TEXT.

Ознакомьтесь с Требованиями к хранилищу MySQL для получения дополнительной информации о том, как используются байты.

person mlambie    schedule 20.10.2009
comment
Очень важный момент, подразумеваемый выше, заключается в том, что при превышении длины VARCHAR строка не будет записана, если база данных находится в строгом режиме (будет сгенерирована ошибка, но усечение в нестрогом режиме также вызывает предупреждение). - person Brian C; 10.03.2019

Небольшая дополнительная местная заметка. Количество используемых байтов будет зависеть от используемой схемы кодирования. 1 байт на символ в кодировке latin1, но до 3 в UTF8. Подробнее см. Ссылку в ответе мламби.

person martin clayton    schedule 20.10.2009
comment
Спасибо. да. Я буду использовать UTF-8, поэтому потребуется двойной байт. - person MySQL DBA; 20.10.2009

Если вы заглянете сюда, он расскажет вам о varchar все, что вы хотите знать: http://dev.mysql.com/doc/refman/5.0/en/char.html

По сути, в зависимости от выбранной вами длины, он будет использовать 1 или два байта для отслеживания длины текущей строки в этом столбце, поэтому он будет хранить количество байтов для введенных вами данных плюс один или два байта.

Итак, если вы введете «abc», тогда для этого столбца в этой строке будет использоваться 4 или 5 байтов.

Если вы использовали char(15), то даже 'abc' заняло бы 15 байтов, так как данные дополняются справа, чтобы использовать полные 15 байтов.

person James Black    schedule 20.10.2009
comment
Привет, Джеймс. Что вы подразумеваете под данными, заполненными справа? Также вы имеете в виду, что даже если я ввел 10 символов в столбец varchar (15), это займет целых 15 байтов для 10 символов, таких как Char (15). - person MySQL DBA; 20.10.2009