Максимальна довжина для тексту типу MySQL


437

Я створюю форму для надсилання приватних повідомлень і хочу встановити maxlengthзначення текстової області відповідно до максимальної довжини textполя в таблиці моїх баз даних MySQL. Скільки символів може зберігати текстове поле?

Якщо багато, чи зможу я вказати довжину в полі типу бази даних, як це було б із varchar?


5
Набравши 64k у простому текстовому полі? болісно ...
Марк Б

169
@Marc B Ніколи не варто недооцінювати вміння користувача вставляти велику кількість сміття в приватне поле текстових повідомлень.
simontemplar

5
І тому ви повинні обмежувати ємність текстового поля і завжди перевіряти свої введення ...
jpangamarca

Відповіді:


750

Перегляньте максимальну кількість: http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html

TINYBLOB, TINYTEXT       L + 1 bytes, where L < 2^8    (255 Bytes)
BLOB, TEXT               L + 2 bytes, where L < 2^16   (64 Kilobytes)
MEDIUMBLOB, MEDIUMTEXT   L + 3 bytes, where L < 2^24   (16 Megabytes)
LONGBLOB, LONGTEXT       L + 4 bytes, where L < 2^32   (4 Gigabytes)

L - кількість байтів у вашому текстовому полі. Отже максимальна кількість символів для тексту становить 2 16 -1 (з використанням однобайтових символів). Значить 65 535 символів (з використанням однобайтових символів).

Кодування UTF-8 / MultiByte : за допомогою кодування MultiByte кожен символ може зайняти більше 1 байту простору. Для UTF-8 витрата місця становить від 1 до 4 байт на char.


2
@ fyr- Ось що означає L + 2 байти, де L <2 ^ 16? Скажіть, будь ласка, трохи більше? Інші мудрі ви можете сказати мені, скільки символів ми можемо зберігати в текстовому полі? Будь ласка ....
Bajrang

2
@JJ L - кількість знаків, і кількість символів повинна бути меншою, ніж 2, потужність 16. 2 ^ 16 = 65536. Отже, ви можете ввести 65535 символів, що споживають 65535 байт + 3 байти = 65 538 байт на повну заповнене поле.
КЮР

9
Зауважте, що обмеження розміру є в байтах . Отже, якщо ви використовуєте багатобайтові символи, ви не отримаєте 2 ^ 16 символів у колонці ТЕКСТ, ви отримаєте однак багато символів, які ви можете зберігати у 2 ^ 16 байт.
Білл Карвін

4
Що сказав Білл Карвін. БЮТИ, а не ХАРАКТЕРИ. Символ може використовувати 4 байти для зберігання із заданим кодуванням (наприклад, 💩 в UTF-8).
базовий6

8
Зауважте, що в MySQL utf8 споживає до 3 байт, utf8mb4 споживає до 4. посилання
mpen

126

TINYTEXT: 256 байт
TEXT:
65,535 байт MEDIUMTEXT: 16,777,215 байт
LONGTEXT: 4,294,967,295 байт


10
Я думаю, що TINYTEXT має бути 255 байт замість 256 байт, відповідно до прийнятої відповіді?
cytsunny

83
Type       | Approx. Length     | Exact Max. Length Allowed
-----------------------------------------------------------
TINYTEXT   | 256 Bytes          |           255 characters
TEXT       |  64 Kilobytes      |        65,535 characters
MEDIUMTEXT |  16 Megabytes      |    16,777,215 characters
LONGTEXT   |   4 Gigabytes      | 4,294,967,295 characters

Примітка: Якщо ви використовуєте багатобайтові символи (наприклад, арабською мовою, де кожен арабський символ займає 2 байти), у стовпці "Точна максимальна довжина дозволена" для TINYTEXTможе містити до 127 арабських символів (Примітка: пробіл, тире, підкреслення та інші подібні символи , є 1-байтовими символами).

В основному, це так:

"Дозволена точна максимальна довжина" = "Приблизна довжина" в байтах - 1


18

Згідно з http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html , межа обмежуєтьсяL + 2 bytes, where L < 2^16 або 64 к.

Вам не потрібно турбуватися про обмеження цього, воно автоматично розбивається на шматки, які додаються в міру зростання рядка, тому він не завжди буде сліпо використовувати 64k.


8

Скільки символів може зберігати текстове поле?

Відповідно до Документації Ви можете використовувати максимум 21 844 символів, якщо набір символів - UTF8

Якщо багато, чи зможу я вказати довжину в полі типу типу db, як це було б із varchar?

Не потрібно вказувати довжину. Якщо вам потрібно більше символів, використовуйте типи даних MEDIUMTEXT або LONGTEXT. Для VARCHAR вказана довжина не відповідає вимогам зберігання, це лише для того, як дані отримуються з бази даних.


8
TINYTEXT 256 bytes
TEXT 65,535 bytes ~64kb
MEDIUMTEXT 16,777,215 bytes ~16MB
LONGTEXT 4,294,967,295 bytes ~4GB

TINYTEXTце рядковий тип даних, який може зберігати до 255символів.

TEXTце рядковий тип даних, який може зберігати до 65,535символів.TEXTзазвичай використовується для коротких статей.

LONGTEXT- це рядковий тип даних із максимальною довжиною 4,294,967,295символів. Використовуйте, LONGTEXTякщо вам потрібно зберігати великий текст, наприклад, главу роману.


1

TEXTце рядковий тип даних, який може зберігати до 65,535 символів. Але якщо ви хочете зберігати більше даних, то змініть тип даних наLONGTEXT

ALTER TABLE name_tabelCHANGE text_fieldLONGTEXT CHARACTER SET utf8COLLATE utf8_general_ciNOT NULL;


1

Для версії MySql 8.0.

Вимоги до зберігання цифрового типу

Data Type       Storage Required
TINYINT         1 byte
SMALLINT        2 bytes
MEDIUMINT       3 bytes
INT, INTEGER    4 bytes
BIGINT          8 bytes
FLOAT(p)        4 bytes if 0 <= p <= 24, 8 bytes if 25 <= p <= 53
FLOAT           4 bytes
DOUBLE, REAL    8 bytes
DECIMAL(M,D), NUMERIC(M,D)  Varies; see following discussion
BIT(M)  approximately (M+7)/8 bytes

Значення стовпців DECIMAL (і NUMERIC) представлені у двійковому форматі, який пакує дев'ять десяткових (базових 10) цифр у чотири байти. Зберігання цілої та дробової частин кожного значення визначається окремо. Кожна кратна з дев'яти цифр потребує чотирьох байтів, а для "залишків" цифр потрібна частина чотирьох байтів. Зберігання, необхідне для надмірних цифр, наведено в наступній таблиці.

Вимоги збереження дати та часу для стовпців TIME, DATETIME та TIMESTAMP, необхідне для зберігання таблиць, створених до MySQL 5.6.4, відрізняється від таблиць, створених від 5.6.4. Це пов'язано зі зміною 5.6.4, яка дозволяє цим типам мати дробову частину, для чого потрібно від 0 до 3 байт.

Data Type   Storage Required Before MySQL 5.6.4   Storage Required as of MySQL 5.6.4
YEAR        1 byte                                1 byte
DATE        3 bytes                               3 bytes
TIME        3 bytes                               3 bytes + fractional seconds storage
DATETIME    8 bytes                               5 bytes + fractional seconds storage
TIMESTAMP   4 bytes                               4 bytes + fractional seconds storage

За станом на MySQL 5.6.4, зберігання для YEAR та DATE залишається незмінним. Однак TIME, DATETIME і TIMESTAMP представлені по-різному. DATETIME пакується більш ефективно, вимагаючи 5, а не 8 байт для нефракційної частини, і всі три частини мають дробову частину, що вимагає від 0 до 3 байт, залежно від точності дробів, що зберігаються.

Fractional Seconds Precision    Storage Required
0                               0 bytes
1, 2                            1 byte
3, 4                            2 bytes
5, 6                            3 bytes

Наприклад, TIME (0), TIME (2), TIME (4) та TIME (6) використовують 3, 4, 5 та 6 байт відповідно. TIME і TIME (0) еквівалентні і потребують однакового сховища.

Докладніше про внутрішнє подання тимчасових значень див. У внутрішніх службах MySQL: Важливі алгоритми та структури.

Вимоги зберігання рядкових типів У наступній таблиці M представляє оголошену довжину стовпців у символах для небінарних типів рядків та байтів для типів бінарних рядків. L представляє фактичну довжину в байтах заданого значення рядка.

Data Type                    Storage Required
CHAR(M)                      The compact family of InnoDB row formats optimize storage for variable-length character sets. See COMPACT Row Format Characteristics. Otherwise, M × w bytes, <= M <= 255, where w is the number of bytes required for the maximum-length character in the character set.
BINARY(M)                    M bytes, 0 <= M <= 255
VARCHAR(M), VARBINARY(M)     L + 1 bytes if column values require 0  255 bytes, L + 2 bytes if values may require more than 255 bytes
TINYBLOB, TINYTEXT           L + 1 bytes, where L < 28
BLOB, TEXT                   L + 2 bytes, where L < 216
MEDIUMBLOB, MEDIUMTEXT       L + 3 bytes, where L < 224
LONGBLOB, LONGTEXT           L + 4 bytes, where L < 232
ENUM('value1','value2',...)  1 or 2 bytes, depending on the number of enumeration values (65,535 values maximum)
SET('value1','value2',...)   1, 2, 3, 4, or 8 bytes, depending on the number of set members (64 members maximum)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.