Требования к хранению типов данных
В следующих таблицах указаны приблизительные требования к хранению каждого типа данных.
Числовые типы данных
| Тип данных | Требования к хранению |
|---|---|
| TINYINT | 1 байт |
| SMALLINT | 2 байта |
| MEDIUMINT | 3 байта |
| INT | 4 байта |
| BIGINT | 8 байт |
| FLOAT(p) | 4 байта, если p ≤ 24, иначе 8 байт |
| DOUBLE | 8 байт |
| DECIMAL | См. таблицу ниже |
| BIT(M) | (M+7)/8 байт |
Обратите внимание, что столбцы MEDIUMINT потребуют 4 байта в памяти (например, в кэше буфера InnoDB).
Десятичные
Десятичные значения хранятся в двоичном формате, причём целая и дробная части хранятся отдельно. Каждые девять цифр требуют 4 байта, а оставшиеся цифры — количество байтов, указанное ниже:
| Остальные цифры | Требования к хранению |
|---|---|
| 0 | 0 байт |
| 1 | 1 байт |
| 2 | 1 байт |
| 3 | 2 байта |
| 4 | 2 байта |
| 5 | 3 байта |
| 6 | 3 байта |
| 7 | 4 байта |
| 8 | 4 байта |
Строковые типы данных
В описаниях ниже, M — это объявленная длина столбца (в символах или байтах), а len — фактическая длина значения в байтах.
| Тип данных | Требования к хранению |
|---|---|
| ENUM | 1 байт для до 255 значений перечисления, 2 байта для 256–65 535 значений перечисления |
| CHAR(M) | M × w байт, где w — количество байт, необходимое для символа максимальной длины в наборе символов |
| BINARY(M) | M байт |
| VARCHAR(M), VARBINARY(M) | len + 1 байт, если столбец содержит 0–255 байт, len + 2 байта, если столбец может потребовать более 255 байт |
| TINYBLOB, TINYTEXT | len + 1 байт |
| BLOB, TEXT | len + 2 байта |
| MEDIUMBLOB, MEDIUMTEXT | len + 3 байта |
| LONGBLOB, LONGTEXT | len + 4 байта |
| SET | При M членах множества (M+7)/8 байт, округляется до 1, 2, 3, 4 или 8 байт |
| INET6 | 16 байт |
| UUID | 16 байт |
В некоторых наборах символов не все символы используют одинаковое количество байт. utf8 кодирует символы от одного до трёх байт на символ, в то время как utf8mb4 требует от одного до четырёх байт на символ.
При использовании атрибута COMPRESSED, 1 байт зарезервирован для метаданных. Например, VARCHAR(255) будет использовать +2 байта вместо +1.
Примеры
Предполагая однобайтовый набор символов:
| Значение | CHAR(2) | Требуемое хранение | VARCHAR(2) | Требуемое хранение |
| '' | ' ' | 2 байта | '' | 1 байт |
| '1' | '1 ' | 2 байта | '1' | 2 байта |
| '12' | '12' | 2 байта | '12' | 3 байта |
Типы данных даты и времени
| Тип данных | Требования к хранению |
|---|---|
| DATE | 3 байта |
| TIME | 3 байта |
| DATETIME | 8 байт |
| TIMESTAMP | 4 байта |
| YEAR | 1 байт |
Микросекунды
MariaDB 5.3 и MySQL 5.6 добавили микросекунды. Реализации хранения отличались, но начиная с MariaDB 10.1, MariaDB использует формат MySQL (с помощью переменной mysql56_temporal_format). Микросекунды имеют следующие дополнительные требования к хранению:
MySQL 5.6+ и MariaDB 10.1+
| Точность | Требования к хранению |
|---|---|
| 0 | 0 байт |
| 1,2 | 1 байт |
| 3,4 | 2 байта |
| 5,6 | 3 байта |
MariaDB 5.3 - MariaDB 10.0
| Точность | Требования к хранению |
|---|---|
| 0 | 0 байт |
| 1,2 | 1 байт |
| 3,4,5 | 2 байта |
| 6 | 3 байта |
NULL
Для форматов строк InnoDB COMPACT, DYNAMIC и COMPRESSED, в заголовке записи выделяется количество байт для столбцов, которые могут принимать значение NULL. Если таких столбцов от 1 до 8, выделяется 1 байт. В области данных записи место не резервируется для значений NULL.
Для формата строк InnoDB REDUNDANT накладные расходы составляют 1 бит в заголовке записи (как часть 1-байтового или 2-байтового указателя «конец поля»). В этом формате столбец с типом NULL занимает такое же пространство, как и столбец с типом NOT NULL в области данных записи. Это связано с возможностью обновлять значения между NOT NULL и NULL.
В других форматах значения NULL обычно занимают 1 бит в файле данных и 1 байт в файле индексов.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/data-type-storage-requirements/