Який максимальний розмір MySQL VARCHAR?


300

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

Я читав, що максимальний розмір обмежений розміром рядка, який становить близько 65 к. Я спробував встановити поле, varchar(20000)але воно говорить, що це занадто велика кількість.

Я міг би це встановити varchar(10000). Який точний макс я можу встановити?


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 555 у версії 5.0.3 та пізніших версіях. Ефективна максимальна довжина VARCHAR у MySQL 5.0.3 та пізніших версіях залежить від максимального розміру рядка (65,535 байт, який поділяється між усіма стовпцями) та використовуваного набору символів.

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

Використовуйте TEXTтипи fororder, щоб подолати обмеження розміру рядків.

Чотири типи TEXT - TINYTEXT, TEXT, MEDIUMTEXT і LONGTEXT. Вони відповідають чотирьом типам BLOB і мають однакові максимальні довжини та вимоги до зберігання.

Детальніше про типи BLOB та TEXT

Навіть більше

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


4
що таке "довга" струна?
Річард Н

6
Я намагаюся уникати TEXT-стовпців, хоча, оскільки вони можуть спричинити створення тимчасових таблиць під час присутності та сортування
Роберт Свішер

1
Якщо я візьму varchar (200) для свого імені і в цьому полі я зберігаю лише 6 знаків, то скільки байтових імен буде зайнято?
Paresh Gami

2
@PareshGami - 6 + 1 = 7 символів! На відміну від CHAR, значення VARCHAR зберігаються у вигляді 1-байтової або 2-байтної префікса плюс дані. докладніше ...
rajukoyilandy

58

Відповідно до онлайнових документів , існує обмеження рядка 64K, і ви можете опрацювати розмір рядка, використовуючи:

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( це utf8кодування MySQL, а не "реальний" UTF-8, який може мати до чотирьох байт ).

Але якщо розмір вашого рядка наближається до 64 К, ви можете вивчити схему вашої бази даних. Це рідкісна таблиця, яка повинна бути такою широкою в правильно налаштованій (3NF) базі даних - це можливо, просто не дуже часто.

Якщо ви хочете використовувати більше, ви можете використовувати типи BLOBабо TEXT. Вони не враховуються до 64K межі рядка (крім невеликого адміністративного сліду), але вам потрібно знати про інші проблеми, що виникають внаслідок їх використання, наприклад, не в змозі сортувати за допомогою всього текстового блоку понад певну кількість символів (хоча це можна налаштувати вгору), змушуючи тимчасові таблиці знаходитись на диску, а не в пам'яті, або потребувати налаштування клієнтських та серверних буферів для ефективної обробки розмірів.

Дозволені розміри:

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), але він все ще значно розширює ваш діапазон.


4
Майте на увазі, що типи TEXT НЕ можуть зберігатися в таблицях пам'яті, тому існує значне покарання за їх використання, коли достатньо VARCHAR.
Камден С.

"властивість трьох байтів на символ utf8" MySql utf8 , яка насправді не є utf8. Насправді макс. байт у графі utf-8 - 4 . З цієї причини ви завжди повинні встановити кодування utf8mb4в MySQL . utf8mb4- ім'я MySql, що решта слова називає utf8.
Штійн де Вітт

1
@StijndeWitt, дякую за це. уточнено, щоб вказати, що я мав на увазі метод utf8 кодування MySQL, а не UTF-8. Зазвичай я використовую прописний варіант для позначення "справжнього" UTF-8, оскільки це прийнята конвенція IANA.
paxdiablo

41

Джерело

Максимальна довжина варшара залежить від максимального розміру рядка в MySQL, який становить 64 КБ (без урахування BLOB):

VARCHAR (65535) Однак зауважте, що ліміт нижчий, якщо ви використовуєте багатобайтовий набір символів:

ВАРХАР (21844) ХАРАКТЕР НАСТРОЙКА utf8


20
Будь ласка, перестаньте використовувати CHARACTER SET utf8в прикладах. Це має бути CHARACTER SET utf8mb4(якщо ви хочете, щоб весь текст Unicode зберігався належним чином ... а хто цього не хоче?)
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 555 символів. При використанні utf8 буде використано 3 байти на символ, що призведе до обмеження символів 21,844. АЛЕ, якщо ви використовуєте сучасний багатобайтовий набір шаф utf8mb4, який вам слід використовувати! Він підтримує емоджи та інші спеціальні символи. Він буде використовувати 4 байти на символ. Це обмежить кількість символів у таблиці до 16 383. Зауважте, що інші поля, такі як INT, також будуть враховані до цих меж.

Висновок:

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

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


6

ви також можете використовувати MEDIUMBLOB / LONGBLOB або MEDIUMTEXT / LONGTEXT

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


3

До Mysql версії 5.0.3 тип даних Varchar може зберігати 255 символів, але від 5.0.3 він може зберігати 65535 символів.

АЛЕ у нього є обмеження максимального розміру рядка 65535 байт. Це означає, що включаючи всі стовпці, вона не повинна перевищувати 65,535 байт.

У вашому випадку можливо, що при спробі встановити більше 10000 вона перевищує понад 65535, і mysql видасть помилку.

Для отримання додаткової інформації: https://dev.mysql.com/doc/refman/5.0/en/column-count-limit.html

блог із прикладом: http://goo.gl/Hli6G3


-5

Ви можете використовувати TEXTтип , який не обмежується 64 КБ.


31
Це не дає відповіді на запитання.
DreamWave

1
Ваша відповідь не стосується питання.
Гиріш
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.