MySQL | Типы данных
Последнее обновление: 25.05.2018
При определении столбцов таблицы для них необходимо указать тип данных. Каждый столбец должен иметь тип данных. Тип данных определяет, какие значения могут храниться в столбце, сколько они будут занимать места в памяти.
MySQL предоставляет следующие типы данных, которые можно разбить на ряд групп.
Символьные типы
CHAR: представляет строку фиксированной длины.
Длина хранимой строки указывается в скобках, например,
CHAR(10)
— строка из десяти символов. И если в таблицу в данный столбец сохраняется строка из 6 символов (то есть меньше установленной длины в 10 символов), то строка дополняется 4 пробелами и в итоге все равно будет занимать 10 символовТип CHAR может хранить до 255 байт.
VARCHAR: представляет строку переменной длины.
Длина хранимой строки также указыватся в скобках, например,
VARCHAR(10)
.Всего тип VARCHAR может хранить до 65535 байт.
Начиная с MySQL 5.6 типы CHAR и VARCHAR по умолчанию используют кодировку UTF-8, которая позволяет использовать до 3 байт для хранения символа в зависимости от языка ( для многих европейских языков по 1 байту на символ, для ряда восточно-европейских и ближневосточных — 2 байта, а для китайского, японского, корейского — по 3 байта на символ).
Ряд дополнительных типов данных представляют текст неопределенной длины:
TINYTEXT: представляет текст длиной до 255 байт.
TEXT: представляет текст длиной до 65 КБ.
MEDIUMTEXT: представляет текст длиной до 16 МБ
LARGETEXT: представляет текст длиной до 4 ГБ
Числовые типы
TINYINT: представляет целые числа от -128 до 127, занимает 1 байт
BOOL: фактически не представляет отдельный тип, а является лишь псевдонимом для типа
TINYINT(1)
и может хранить два значения 0 и 1. Однако данный тип может также в качестве значения принимать встроенные константы TRUE (представляет число 1) и FALSE (предоставляет число 0).Также имеет псевдоним BOOLEAN.
TINYINT UNSIGNED: представляет целые числа от 0 до 255, занимает 1 байт
SMALLINT: представляет целые числа от -32768 до 32767, занимает 2 байтa
SMALLINT UNSIGNED: представляет целые числа от 0 до 65535, занимает 2 байтa
MEDIUMINT: представляет целые числа от -8388608 до 8388607, занимает 3 байта
MEDIUMINT UNSIGNED: представляет целые числа от 0 до 16777215, занимает 3 байта
INT: представляет целые числа от -2147483648 до 2147483647, занимает 4 байта
INT UNSIGNED: представляет целые числа от 0 до 4294967295, занимает 4 байта
BIGINT: представляет целые числа от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807, занимает 8 байт
BIGINT UNSIGNED: представляет целые числа от 0 до 18 446 744 073 709 551 615, занимает 8 байт
DECIMAL: хранит числа с фиксированной точностью. Данный тип может принимать два параметра
precision
иscale
:DECIMAL(precision, scale)
.Параметр
precision
представляет максимальное количество цифр, которые может хранить число. Это значение должно находиться в диапазоне от 1 до 65.Параметр
scale
представляет максимальное количество цифр, которые может содержать число после запятой. Это значение должно находиться в диапазоне от 0 до значения параметра precision. По умолчанию оно равно 0.Например, в определении следующего столбца:
salary DECIMAL(5,2)
Число 5 —
precision
, а число 2 —scale
, поэтому данный столбец может хранить значения из диапазона от -999.99 до 999.99.Размер данных в байтах для DECIMAL зависит от хранимого значения.
Данный тип также имеет псевдонимы NUMERIC, DEC, FIXED.
FLOAT: хранит дробные числа с плавающей точкой одинарной точности от -3. 4028 * 1038 до 3.4028 * 1038, занимает 4 байта
Может принимать форму
.FLOAT(M,D)
, где
— общее количество цифр, аD
— количество цифр после запятойDOUBLE: хранит дробные числа с плавающей точкой двойной точности от -1.7976 * 10308 до 1.7976 * 10308, занимает 8 байт. Также может принимать форму
DOUBLE(M,D)
, гдеM
— общее количество цифр, аD
— количество цифр после запятой.Данный тип также имеет псевдонимы REAL и DOUBLE PRECISION, которые можно использовать вместо DOUBLE.
Типы для работы с датой и временем
DATE: хранит даты с 1 января 1000 года до 31 деабря 9999 года (c «1000-01-01» до «9999-12-31»). По умолчанию для хранения используется формат yyyy-mm-dd. Занимает 3 байта.
TIME: хранит время от -838:59:59 до 838:59:59. По умолчанию для хранения времени применяется формат «hh:mm:ss». Занимает 3 байта.
DATETIME: объединяет время и дату, диапазон дат и времени — с 1 января 1000 года по 31 декабря 9999 года (с «1000-01-01 00:00:00» до «9999-12-31 23:59:59»). Для хранения по умолчанию используется формат «yyyy-mm-dd hh:mm:ss». Занимает 8 байт
TIMESTAMP: также хранит дату и время, но в другом диапазоне: от «1970-01-01 00:00:01» UTC до «2038-01-19 03:14:07» UTC. Занимает 4 байта
YEAR: хранит год в виде 4 цифр. Диапазон доступных значений от 1901 до 2155. Занимает 1 байт.
Тип Date может принимать даты в различных форматах, однако непосредственно для хранения в самой бд даты приводятся к формату «yyyy-mm-dd». Некоторые из принимаемых форматов:
yyyy-mm-dd
—2018-05-25
yyyy-m-dd
—2018-5-25
yy-m-dd
—18-05-25
В таком формате двузначные числа от 00 до 69 воспринимаются как даты в диапазоне 2000-2069.
А числа от 70 до 99 как диапазон чисел 1970 — 1999.yyyymmdd
—20180525
yyyy.mm.dd
—2018.05.25
Для времени тип Time использует 24-часовой формат. Он может принимать время в различных форматах:
Примеры значений для типов DATETIME и TIMESTAMP:
2018-05-25 19:21:34
2018-05-25
(хранимое значение2018-05-25 00:00:00
)
Составные типы
Бинарные типы
TINYBLOB: хранит бинарные данные в виде строки длиной до 255 байт.
BLOB: хранит бинарные данные в виде строки длиной до 65 КБ.
MEDIUMBLOB: хранит бинарные данные в виде строки длиной до 16 МБ
LARGEBLOB: хранит бинарные данные в виде строки длиной до 4 ГБ
НазадСодержаниеВперед
Типы данных в MySQL — Блог компании Селектел
Эта инструкция
является частью курса
Введение
При создании таблиц в MySQL для каждого столбца нужно указывать тип данных. Он определяет, какие данные там могут храниться, как будут обрабатываться и сколько места будут занимать. В MySQL все типы данных делятся на несколько классов: числовые типы, символьные, дата/время и так далее. В каждом классе есть несколько типов данных, которые внешне могут быть похожи, но их поведение или принципы хранения отличаются. Важно выбрать правильный тип сразу при создании таблицы, потому что потом готовую структуру и приложения будет сложней переделать.
В этой статье мы расскажем об основных типах данных в MySQL и дадим советы, где лучше использовать тот или иной тип.
Возможности MySQL в «Облачных базах данных»
ПодробнееЧисловые типы
Используются для хранения чисел. Бывают целочисленными, с плавающей точкой и с фиксированной точкой.
Целые числа
Хранят только целые числа, без дробной части. Делятся на signed (со знаком) и unsigned (без знака). Типы singed позволяют хранить как положительные, так и отрицательные значения. Типы unsigned хранят только положительные числа, но зато диапазон значений больше. Это может быть полезно в случаях, когда хранимые значения заведомо не могут быть отрицательным. Например, количество товара или идентификатор записи в таблице.
Тип | Размер (байт) | Диапазон signed | Диапазон unsigned |
TINYINT | 1 | -128 … 127 | 0 … 255 |
SMALLINT | 2 | -3 2768 … 32 767 | 0 … 65 535 |
MEDIUMINT | 3 | -8 388 608 … 8388607 | 0 … 16 777 215 |
INT | 4 | 2 147 483 648 … 2 147 483 647 | 0 … 42 94 967 295 |
BIGINT | 8 | -263 … 263-1 | 0 … 264-1 |
Числа с плавающей точкой
Хранят приблизительные значения. Не резервируют определенное количество бит для целочисленной или дробной частей. Поэтому у всех значений в таблице количество до и после запятой будет разным.
Тип | Размер (байт) | Диапазон |
FLOAT | 4 | -3.402823466E+38 … -1.175494351E-38 и 1.175494351E-38 … 3.402823466E+38 |
DOUBLE | 8 | -1.7976931348623157E+308 … -2.2250738585072014E-308 и2.2250738585072014E-308 … 1.7976931348623157E+308 |
До версии MySQL 8.0.17 эти типы данных поддерживали диапазон unsigned, но он работал не так, как с целыми числами. Беззнаковый диапазон просто запрещал сохранять отрицательные значения, при этом максимальное значение не увеличивалось. Начиная с версии 8.0.17, использование unsigned не рекомендуется и считается устаревшим. В будущих версиях MySQL поддержку беззнакового диапазона для этого типа данных могут вовсе удалить.
Числа с фиксированной точкой
Эти типы данных используются для сохранения заданной точности. Такие числа резервируют определенное количество бит для целочисленной и дробной частей. Независимо от того, насколько большое или маленькое число, оно всегда будет использовать одно и то же количество бит для сохранения каждой части. Эти типы данных подходят для случаев, когда важна точность, например, деньги.
В MySQL для хранения чисел с фиксированной точкой используются типы DECIMAL(M,D) и NUMERIC(M,D), но по факту это синонимы. Можно использовать любой из этих типов, результат будет одинаковым. В таких столбцах максимально можно хранить до 65 чисел вместе с целочисленной и дробной частями.
Символьные (строковые)
Символьные типы используются для хранения текстов. Есть два основных типа: CHAR и VARCHAR. С точки зрения пользователя они выглядят похоже, но MySQL хранит и обрабатывает их по-разному.
- CHAR хранит строку фиксированной длины до 255 символов. Если длина вставляемой записи меньше, то MySQL автоматически дополняет значение пробелами. Например, если мы указали тип CHAR(10) и сохранили строку «Привет», то по факту в БД будет храниться строка «Привет » (обратите внимание на четыре пробела в конце строки).
Кажется, что это лишняя трата места. Но если во всех ваших записях хранятся строки примерно одной длины, то тип CHAR будет очень производительным. Например, его можно использовать для хранения хешей, у которых длина всегда одинакова.
- VARCHAR хранит строки переменной длины до 65 535 символов. Причем в памяти хранится именно та длина, которая была указана при создании. VARCHAR занимает меньше места, чем CHAR, но подвержен фрагментации и из-за этого может проигрывать в скорости обработки данных.
Текстовые и бинарные
Текстовые (TEXT) и бинарные (BLOB) типы данных используются для хранения больших объемов текста или двоичных данных. Эти типы похожи, но отличаются по способу хранения и обработки внутри MySQL.
- BLOB обрабатывается как двоичные данные. В нем не хранится набор символов, а операции сортировки и сравнения основаны на числовых значениях байтов.
- TEXT обрабатывается как символьные строки. В нем хранится именно набор символов, а значения сортируются и сравниваются на основе сопоставления набора символов..
Текстовые типы отлично подходят для хранения больших текстов: статей, докладов и так далее. А бинарные типы могут хранить любые файлы или мультимедиа-контент.
Тип | Размер (байт) | Макс. размер символов |
TINYTEXT / TINYBLOB | 255 | 255 |
TEXT / BLOB | 65 535 | 65 535 |
MEDIUMTEXT / MEDIUMBLOB | 16 777 215 | 224-1 |
LONGTEXT / LONGBLOB | 4 294 967 295 | 232-1 |
Кажется, что типы TINYTEXT и TEXT похожи на CHAR и VARCHAR. Но разница в том, что MySQL не умеет индексировать текстовые и бинарные типы и не может использовать индексы для сортировки.
Дата/время
Типы данных, которые позволяют работать с датой и временем.
Тип | Размер (байт) | Описание |
DATE | 3 | Только дата в формате YYYY-MM-DD. Допустимые значения от 1000-01-01 до 9999-12-31 |
DATETIME | 8 | Дата и время в формате YYYY-MM-DD HH:MM:SS. Допустимые значения от 1000-01-01 00:00:00 до 9999-12-31 23:59:59 |
TIMESTAMP | 4 | Дата и время. Хранится в виде количества секунд, прошедших с 1 января 1970 года по гринвичу. Занимает в два раза меньше места, чем тип DATETIME. Но при этом диапазон ограничен значениями от 1970-01-01 00:00:01 до 2038-01-09 03:14:07 |
TIME | 3 | Только время в формате HH:MM:SS. Допустимые значения от 00:00:00 до 23:59:59 |
YEAR(N) | 1 | Только год в формате YYYY или YY. Допустимые значения от 1901 до 2155 или от 70 до 69 (1970 — 2069) |
JSON
Это относительно новый тип данных, который появился в MySQL версии 5. 7.8. Он позволяет нативно хранить и обрабатывать данные в JSON-формате.
В отличие от хранения объектов в виде текста, в использовании специального типа данных есть несколько преимуществ:
- Валидация JSON-объектов. Если попытаться сохранить неправильный JSON, MySQL сгенерирует ошибку.
- Возможность нативно работать с JSON, выбирать и обновлять только отдельные части объектов, а не весь объект целиком.
- MySQL сохраняет тип JSON в специальном внутреннем формате. Такой способ более производительный, чем работа с JSON в виде строки.
Составные типы
Строковые типы данных, которые могут хранить значения только из заранее определенного списка. Несмотря на то, что список значений состоит из строк, в самих таблицах хранятся только числа, которые ассоциированы со справочником возможных значений. Поэтому они занимают мало места.
- ENUM может хранить только одно значение из списка, занимает 1-2 байта.
- SET может хранить одновременно до 64 значений из списка, занимает от 1 до 8 байт.
Заключение
Мы рассмотрели основные типы данных и полей в MySQL, объяснили разницу между схожими типами. Теперь вы можете создавать свои структуры БД, используя полученные знания.
Зарегистрироваться в панели управления
Регистрируйте аккаунт в панели управления Selectel, пополняйте баланс удобным способом и подключайте наши продукты.
Перейти в панель
Узнать о продукте больше
Все о принципах работы, задачах и фичах «Облачных баз данных» читайте на нашем сайте.
Читать про продукт
12.22.2 Характеристики типа данных DECIMAL
12.22.2 Характеристики типа данных DECIMAL
В этом разделе рассматриваются характеристики DECIMAL
тип данных (и его
синонимы), уделяя особое внимание следующим темам:
Максимальное количество цифр
Формат хранения
Требования к хранению
Нестандартное расширение MySQL для верхнего диапазона
ДЕСЯТИЧНОЕ
столбцов
Синтаксис объявления для DECIMAL
столбец ДЕСЯТИЧНЫЙ(
. Диапазоны значений аргументов следующие: M
, D
)
Если D
опущено, значение по умолчанию равно 0. Если М
опущен, по умолчанию 10.
Максимальное значение 65 для M
означает
что расчеты по DECIMAL
значениям
имеют точность до 65 цифр. Этот предел 65 цифр точности
также применяется к числовым литералам с точным значением, поэтому максимальный диапазон
таких литералов отличается от предыдущего. (Есть также ограничение на
как долго текст DECIMAL
литералы могут быть; видеть
Раздел 12.22.3, «Обработка выражений».)
Значения для столбцов DECIMAL
хранится в двоичном формате, который упаковывает девять десятичных цифр в 4
байт. Требования к хранению целых и дробных чисел
части каждой стоимости определяются отдельно. Каждое кратное
для девяти цифр требуется 4 байта, а любые оставшиеся цифры
требуется некоторая часть 4 байтов. Хранилище, необходимое для
остальные цифры приведены в следующей таблице.
Оставшиеся цифры | Количество байтов |
---|---|
0 | 0 |
1–2 | 1 |
3–4 | 2 |
5–6 | 3 |
7–9 | 4 |
Например, DECIMAL(18,9) 9В столбце 0008 девять
цифры по обе стороны от запятой, поэтому целая часть
и дробная часть требует 4 байта. А
DECIMAL(20,6)
столбец содержит четырнадцать целых чисел
цифры и шесть дробных цифр. Целые числа требуют четырех
байты для девяти цифр и 3 байта для оставшихся пяти
цифры. Шесть дробных цифр требуют 3 байта.
DECIMAL
столбцы не хранят
ведущий +
символ или -
символ или начальный 0
цифр. Если вы вставите +0003.1
в ДЕСЯТИЧНОЕ (5,1)
столбец, он хранится как 3.1
. Для отрицательных
числа, буквальный символ -
не сохраняется.
DECIMAL
столбцов не разрешается
значения больше, чем диапазон, подразумеваемый определением столбца. За
например, столбец DECIMAL(3,0)
поддерживает диапазон
из -999
до 999
. А ДЕСЯТИЧНЫЙ (
Колонка разрешает до M
, D
) M
- D
цифр слева от запятой
точка.
Стандарт SQL требует, чтобы точность ЦИФРОВОЙ (
быть ровно M
, D
) М
цифры. За ДЕСЯТИЧНЫЙ (
,
стандарт требует точности не менее M
, D
) M
цифр, но можно больше. В MySQL, ДЕСЯТИЧНЫЙ (
а также M
, D
) ЦИФРОВОЙ (
одинаковы, и оба имеют точность точно M
, D
) М
цифр.
Для полного объяснения внутреннего формата DECIMAL
значений, см. файл строк/decimal.c
в источнике MySQL
распределение. Формат объясняется (с примером) в функция decimal2bin()
.
Объяснение типа данных MySQL DECIMAL
Тип данных MySQL DECIMAL
является одним из числовых типов данных в MySQL, который может хранить числа с десятичными точками.
ДЕСЯТИЧНОЕ 9Тип 0008 требует больше места для хранения, чем
FLOAT
или DOUBLE
, потому что DECIMAL
хранит точное представление вашего числового значения.
Чтобы увидеть, чем тип DECIMAL
отличается от DOUBLE
, в качестве примера создадим таблицу с числовыми данными.
Предположим, в вашей базе данных есть таблица номеров
со следующими данными:
+------------+-------------+ | номер_двойной | числовое_десятичное | +------------+--------------+ | 2,5 | 2.50000 | | 0,01 | 0,01000 | | -1,5 | -1.50000 | +------------+--------------+
Теперь попробуем увеличить каждое значение в столбцах выше на 0,2
следующим образом:
SELECT (num_double + 0,2), (num_decimal + 0,2) FROM чисел;
Возвращаемый набор результатов показан ниже:
+---------------------+-------------- -------+ | (num_double + 0,2) | (число_десятичное + 0,2) | +------------------------------------+-------+ | 2,7 | 2.70000 | | 0,21000000000000002 | 0,21000 | | -1,3 | -1.30000 | +------------------------------------+-------+
Как видите, с типом DOUBLE
возникает проблема при вычислении некоторых чисел с десятичными точками, например 0,01 + 0,1
.
Это связано с тем, что номера типов DOUBLE
хранятся в виде приблизительных представлений. Тип DOUBLE
может хранить больший диапазон возможных чисел, чем DECIMAL
, но при выполнении вычислений будут возникать ошибки точности.
DECIMAL Типы
обычно используются для числовых данных с большим количеством десятичных знаков, которые будут вычисляться далее, например, финансовые или денежные данные.
FLOAT
и DOUBLE
можно использовать для десятичных чисел, которые не требуют дальнейших вычислений и в большинстве случаев являются окончательными, например ежедневные прогнозы погоды.
Когда вы создаете столбец DECIMAL
, вам необходимо указать цифр точности , доступных для столбца ( M
), и количество шкалы , зарезервированное для десятичных знаков ( D
)
М, Д)
Диапазон номеров M
– 9.