Каков максимальный размер MySQL VARCHAR?

300

Я хотел бы знать, каков максимальный размер для типа MySQL VARCHAR.

Я читал, что максимальный размер ограничен размером строки, который составляет около 65 КБ. Я попытался установить поле, varchar(20000)но оно говорит, что оно слишком большое.

Я мог бы установить это varchar(10000). Какой точный максимум я могу установить?

user1832628
источник
1
Подробный блог: goo.gl/Hli6G3
Суреш Камруши

Ответы:

293

Имейте в виду, что MySQL имеет максимальный размер строки

Максимальное значение размера строки во внутреннем представлении таблицы MySQL составляет 65 535 байт, не считая BLOB и TEXT. Столбцы BLOB и TEXT вносят только 9-12 байт в ограничение размера строки, поскольку их содержимое хранится отдельно от остальной части строки. Узнайте больше об ограничениях на количество столбцов в таблице и размер строки.

Максимальный размер, который может занимать один столбец, отличается до и после MySQL 5.0.3

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

Однако обратите внимание, что ограничение ниже, если вы используете многобайтовый набор символов, такой как utf8 или utf8mb4.

Используйте TEXTтипы по порядку, чтобы преодолеть ограничение размера строки.

Четырьмя типами TEXT являются TINYTEXT, TEXT, MEDIUMTEXT и LONGTEXT. Они соответствуют четырем типам BLOB и имеют одинаковую максимальную длину и требования к хранению.

Подробнее о типах BLOB и TEXT

Даже больше

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

rajukoyilandy
источник
4
что такое "длинная" строка?
Ричард Х
6
Я стараюсь избегать столбцов TEXT, поскольку они могут создавать временные таблицы при их наличии и сортировке
Robert Swisher
1
Если я возьму varchar (200) для имени и сохраню только 6 символов в этом поле, то сколько байтов будет занято имя?
Пареш Гами
2
@PareshGami - 6 + 1 = 7 символов! В отличие от CHAR, значения VARCHAR сохраняются как префикс длиной 1 байт или 2 байта плюс данные. больше ...
rajukoyilandy
58

Согласно онлайн-документам , существует ограничение в 64 КБ, и вы можете определить размер строки, используя:

row length = 1
             + (sum of column lengths)
             + (number of NULL columns + delete_flag + 7)/8
             + (number of variable-length columns)

Вы должны иметь в виду, что длины столбцов не являются однозначным отображением их размера. Например, CHAR(10) CHARACTER SET utf8требуется три байта для каждого из десяти символов, поскольку эта конкретная кодировка должна учитывать свойство «три байта на символ» utf8(это кодировка MySQL,utf8 а не «настоящий» UTF-8, который может иметь до четырех байтов). ).

Но, если ваш размер строки приближается к 64 КБ, вы можете изучить схему вашей базы данных. Это редкая таблица, которая должна быть настолько широкой в ​​правильно настроенной (3NF) базе данных - это возможно, но не очень часто.

Если вы хотите использовать больше, вы можете использовать BLOBили TEXT. Они не учитываются при ограничении строки в 64 КБ (кроме небольшого административного следа), но вам необходимо знать о других проблемах, связанных с их использованием, таких как невозможность сортировки с использованием всего текстового блока за пределами определенного числа. символов (хотя это может быть настроено вверх), заставляя временные таблицы быть на диске, а не в памяти, или настраивая буферы связи клиента и сервера для эффективной обработки размеров.

Допустимые размеры:

TINYTEXT          255 (+1 byte  overhead)
TEXT          64K - 1 (+2 bytes overhead)
MEDIUMTEXT    16M - 1 (+3 bytes overhead)
LONGTEXT      4G  - 1 (+4 bytes overhead)

У вас все еще есть несоответствие байтов / символов (так что в MEDIUMTEXT utf8столбце может храниться «только» около полумиллиона символов (16M-1)/3 = 5,592,405), но это все равно значительно расширяет ваш диапазон.

paxdiablo
источник
4
Имейте в виду, что типы TEXT НЕ могут быть сохранены в таблицах памяти, поэтому при использовании VARCHAR будет существенное снижение производительности при их использовании.
Камден С.
свойство «три байта на символ» в utf8 MySql utf8 , которое на самом деле вовсе не является utf8. На самом деле макс. байт в символе utf-8 равно 4 . По этой причине вы всегда должны устанавливать кодировку utf8mb4в MySQL . utf8mb4имя MySql для того, что остальное слово называет utf8.
Стейн де Витт
1
@StijndeWitt, спасибо за это. уточнить, чтобы указать, что я имел в виду MySQL метод кодирования utf8, а не UTF-8. Обычно я использую вариант с заглавной буквы для обозначения «настоящего» UTF-8, поскольку это принятая конвенция IANA.
paxdiablo
41

Источник

Максимальная длина varchar зависит от максимального размера строки в MySQL, который составляет 64 КБ (не считая BLOB):

VARCHAR (65535) Однако обратите внимание, что ограничение ниже, если вы используете многобайтовый набор символов:

VARCHAR (21844) Набор персонажей utf8

Attila
источник
21
Пожалуйста, прекратите использовать CHARACTER SET utf8в примерах. Так и должно быть CHARACTER SET utf8mb4(если вы хотите, чтобы весь текст в Юникоде хранился должным образом ... а кому это не нужно?)
Stijn de Witt
4
Для CHARSET=utf8mb4использования VARCHAR(16383).
Уил Мур III
3
Использование utf8mb4 поставит вас против ограничения ширины индекса в ситуации, когда utf8 нет. Если вы исследуете наборы символов, которые включены в utf8mb4, но не в utf8, вы можете обнаружить, что включение всех различных форм иероглифов и других подобных наборов загадочных символов не стоит значительного снижения производительности (определяется опытным путем). Это не совсем так порезано и высушено, как предполагает Стейн.
kcrossen
Многие смайлики также присутствуют в utf8mb4 и отсутствуют в utf8, так что это может изменить уравнение того, стоит ли это.
Брайан Морарти
23

Из документации MySQL:

Максимальная эффективная длина VARCHAR в MySQL 5.0.3 и более поздних версиях зависит от максимального размера строки (65 535 байт, который распределяется между всеми столбцами) и используемого набора символов. Например, для символов utf8 может потребоваться до трех байтов на символ, поэтому столбец VARCHAR, использующий набор символов utf8, может быть объявлен как максимум 21 844 символа.

Ограничения для VARCHAR варьируются в зависимости от используемой кодировки. Использование ASCII будет использовать 1 байт на символ. Это значит, что вы можете хранить 65 535 символов. Использование utf8 будет использовать 3 байта на символ, в результате чего ограничение на число символов составит 21 844. НО, если вы используете современную многобайтовую кодировку utf8mb4, которую вы должны использовать! Он поддерживает смайлики и другие специальные символы. Он будет использовать 4 байта на символ. Это ограничит количество символов в таблице до 16 383. Обратите внимание, что другие поля, такие как INT, также будут учитываться в этих пределах.

Вывод:

utf8 максимум 21 844 символов

utf8mb4 максимум 16 383 символов

Firze
источник
6

Вы также можете использовать MEDIUMBLOB / LONGBLOB или MEDIUMTEXT / LONGTEXT

Тип BLOB в MySQL может хранить до 65 534 байта, если вы попытаетесь сохранить больше данных, MySQL будет их обрезать. MEDIUMBLOB может хранить до 16 777 213 байт, а LONGBLOB - до 4 294 967 292 байт.

Sriram
источник
3

До версии Mysql 5.0.3 тип данных Varchar может хранить 255 символов, а с версии 5.0.3 - 65 535 символов.

НО это ограничение максимального размера строки 65 535 байт. Это означает, что, включая все столбцы, он не должен превышать 65 535 байт.

В вашем случае может случиться так, что когда вы пытаетесь установить более 10000, оно превышает 65 535, и mysql выдаст ошибку.

Чтобы получить больше информации: https://dev.mysql.com/doc/refman/5.0/en/column-count-limit.html

блог с примером: http://goo.gl/Hli6G3

Суреш Камруши
источник
-5

Вы можете использовать TEXTтип , который не ограничен 64 КБ.

MVP
источник
31
Это не отвечает на вопрос.
DreamWave
1
Ваш ответ не имеет отношения к вопросу.
Гириш