Целые числа
Предназначен для хранения знаковых целых чисел (signed), либо беззнаковых (unsigned). Первый позволяет хранить все числа, как со знаком "+", так и "-". Второй, в свою очередь, хранит только положительные числа, однако их диапазон увеличивается вдвое.
Существует всего 5 основных целых типов: TINYINT, SMALLINT, MEDIUMINT, INT и BIGINT. Основным различием между ними является диапазон хранимых значений. Чем он шире, тем больше необходимо выделять памяти для его хранения. Важно правильно определять нужный тип из всех возможных, чтобы правильно распределять ресурсы памяти при создании таблицы.
Перечень типов, их объем памяти и диапазон чисел представлены в таблице ниже.

Указание размера для целых чисел (например, MEDIUMINT (6)) не изменяет диапазон возможных значений. Это является справочно-сервисной информацией, которую используют некоторые инструменты для работы с MySQL. Данное указание лишь добавит пробелы слева от чисел, которые меньше заданной в скобках длины.
Также можно указать специальный атрибут ZEROFILL, который вместо пробелов поставил 0 на свободные позиции. Он не является обязательным, поэтому им возможно пользоваться только при надобности. Допустим, пользователь указал SMALLINT (8) ZEROFILL, тогда значение 256 будет отображаться в системе следующим образом: 00000256.
Числа с плавающей точкой
Предназначен для хранения приблизительных числовых значений. В MySQL можно определить что использовать для результирующего типа данных благодаря спецификации точности. Она не является обязательной и при необходимости указывает в скобках, как это показано ниже:
FLOAT (p)
p - точность, которая может принимать значения от 0 до 53. Если значение меньше 25, то будет выбран FLOAT() - одинарная точность, иначе DOUBLE() - двойная точность.

Числа с фиксированной точкой
Предназначен для хранения числовых значений с заданной точностью, выделяя для целочисленной и дробной части числа определенный объем памяти. Для этого используют DECIMAL или NUMERIC.
У данных типов можно указывать два параметра в скобках - (M,D). Параметр M указывает на количество отводимых для числа символов, а параметр D на количество символов после запятой. Первый параметр принимает значения до 65 (по умолчанию 10). Второй параметр принимает значения от 0 до 30 (по умолчанию 0).
В качестве примера приведем:
DECIMAL(6,3)
Данный пример позволяет хранить числа, состоящее из шести чисел и трех цифр после запятой. Диапазон подходящих значений будет следующий: от -999.999 до 999.999.
Вышеуказанные типы данных равнозначны, поэтому возможно использовать в своих целях как первый, так и второй. Предназначены они зачастую для сохранения точности и используются зачастую для финансовых вычислений, где важна эта точность и не допустимо округление.
Символьные
Предназначены для хранения небольших текстов. К ним относятся CHAR и VARCHAR. Они похожи между собой. Главное различие между ними - это способ хранения и извлечения данных.
CHAR хранит строку фиксированной длины (от 0 до 28-1 символов), которая задается на этапе создания таблицы. Если происходит передача строки меньшей длины, чем была указана, то оставшиеся символы заполняются пробелами.
Тип данных VARCHAR в MySQL хранит строку переменной длины (от 0 до 216-1 символов), которая также задается на этапе создания таблицы. В отличие от CHAR он хранит только указанную длину, а также выделяет 1 байт для хранения длины строки.
Если длина строки превосходит длину указанную в CHAR или VARCHAR, то передаваемая строка обрезается до допустимой длины.
На этапе создания таблицы, при попытке скомбинировать столбцы CHAR и VARCHAR MySQL изменит тип CHAR на VARCHAR.
Для наглядности ниже будет представлена таблица с примерами хранения разной длины строки для CHAR(5) и VARCHAR(5).

Текстовые и бинарные
Текстовый тип данных в MySQL TEXT предназначен для хранения больших текстовых данных, а бинарный BLOB для хранения двоичных данных, таких как изображения, компилированный программный код или звук. Оба этих метода схожи между собой. Главное их отличие - это способ хранения данных и их обработка. У BLOB сортировка и сравнение происходят с учетом регистра, а у TEXT без учета регистра.
MySQL не имеет возможности индексировать данные TEXT и BLOB по всей длине, а также использовать индексы для сортировки.
Если длина строки превосходит возможную длину TEXT или BLOB, то передаваемая строка обрезается до допустимого значения.
Ниже в таблице представлены все модификации типа TEXT, необходимый объем памяти для них и максимально возможное количество символов.

Для BLOB будет идентичная таблица, что и для TEXT. Она представлена ниже.

Дата и время
Далее будут представлены типы данных для хранения даты и времени. Ниже будет представлена таблица со всеми необходимыми данными.

JSON
MySQL поддерживает свой тип данных, который называется JSON (JavaScript Object Notation). Он был выпущен с версией 5.7.8 и предоставляет следующие преимущества по сравнению с хранением объектов в виде текста:
Объем памяти, необходимый для хранения данных типа JSON, примерно такой же, как и у LONGTEXT.
Составные типы
Особый строковый тип данных, который хранит значения из определенного фиксированного набора. Сюда определяют ENUM и SET. Первый хранит одно значение из набора, которое занимает до двух байт памяти. Второй, в свою очередь, может хранить до 26 значений из набора и занимает до восьми байт памяти.
Например, пользователь объявляет некий список значений для ENUM:
ENUM ('a', 's', 'd')
Тогда значения для такого столбца могут принимать только три значения: это 'a', 's', либо 'd'.
В свою очередь, если пользователь задаст такой же список для SET:
SET ('a', 's', 'd')
Тогда значения для такого столбца могут принимать только следующие значения: это ('a'), ('s'), ('d'), ('a', 's'), ('a', 'd'), ('s', 'd'), ('a', 's', 'd'), либо пустое множество ().
В случае, если пользователь вставит значение ('a', 's', 'a') в таблицу, тогда при его извлечении MySQL выведет каждый элемент только один раз и в том порядке, в котором они задавались во время создания таблицы. Для ('a', 's', 'a') отобразится ('a', 's') при извлечении.
Source: Timeweb