[БЕЗ_ЗВУКА] [БЕЗ_ЗВУКА] Всем привет. В этом видео мы чуть подробнее поговорим о типах данных, которые могут храниться в столбцах MySQL. Есть три наиболее часто используемые их группы. Это числовые типы, строковые типы и типы данных для хранения даты и времени. Также есть тип JSON, который появился относительно недавно, и есть достаточно специфичные типы данных для хранения геоданных. В этом видео мы поговорим о числовых типах данных и о типах данных для хранения даты и времени. Начнём с числовых и с их подраздела — целочисленных типов данных. Это точные типы данных, они позволяют хранить число точно, и их существует пять видов: TINYINT, SMALLINT, MEDIUMINT, INT и BIGINT. Все они очень похожи. Отличаются диапазоном хранимых значений и, соотвественно, занимаемым местом в базе данных: от одного байта для TINYINT'а до восьми байт для BIGINT'а. Также эти числа могут быть со знаком или без знака. Если это знаковое число, то диапазон допустимых значений распределяется равномерно вокруг нуля, и, соответственно, они могут хранить какую-то часть меньше нуля, какую-то часть больше нуля, а если это число без знаков, то весь этот диапазон сдвигается в положительную плоскость, и вы не можете хранить отрицательные, зато можете хранить как бы больше положительных чисел. Поэтому если в вашей задаче в какой-то ячейке не могут храниться отрицательные числа, например, это цена, которая не может быть меньше нуля или количество, которое не может быть отрицательным, то имеет смысл сделать эту ячейку неотрицательной, то есть беззнаковой. Вот табличка, в которой приведены все эти типы, размер байт, которые они занимают в базе данных, и диапазоны значений, которые они могут хранить. Дальше давайте поговорим о типах с фиксированной точкой. Это числовой тип данных, который позволяет хранить дробные числа. В MySQL существуют DECIMAL и NUMERIC, и они, на самом деле, одно и то же, никакой разницы между ними в MySQL нет. Хранятся эти данные в двоичном виде в базе и, грубо говоря, занимают по четыре байта на каждые девять цифр, причём отдельно четыре байта для каждых девяти цифр целой части и по четыре байта для каждой из девяти цифр дробной части. Но это грубо. Также у этих DECIMAL указывается два параметра при создании колонки этого типа: M и D. M — это сколько цифр всего в этом числе, а D — сколько из них после запятой. Так, например, число DECIMAL (5,2) может хранить числа от −999.99 до +999.99. Эти числа, как я уже говорил, точные, при каких-то операциях с ними нет ошибок округления. Дальше поговорим о числах с плавающей точкой. Они похожи на предыдущие. Их существует два типа: FLOAT и DOUBLE. FLOAT — одинарная точность, занимает четыре байта в базе; DOUBLE — двойная точность, восемь байт. Соответственно, тип FLOAT точен где-то до седьмого знака после запятой, тип DOUBLE где-то до 15-го. Поскольку эти числа неточные, то когда вы туда записываете, например, 2, по факту может храниться в памяти компьютера не 2, а 2,0000... и где-то там в конце 1. Из-за этого могут возникнуть проблемы при сравнении. Такие числа лучше не сравнивать прямым равенством, а смотреть их попадание в какой-то диапазон. Вот такой нюанс у чисел с плавающей точкой, но это не касается конкретно MySQL, а вообще в принципе. Также существует тип BIT. Это тип для хранения двоичных значений. Можно указать BIT(M), M — какое-то число, он будет позволять хранить M-битные значения. При этом M может быть от 1 до 64, то есть максимум можно хранить 64-битные значения. Также существует литерал, начинающийся с буквы b и дальше там единицы и нули, который позволяет записать вот это двоичное число, собственно, в двоичном виде с помощью единиц и нулей. Давайте теперь поговорим о типах для хранения даты и времени. Их существует пять штук: DATE, DATETIME, TIMESTAMP, TIME и YEAR. DATETIME занимает в базе пять байт и может занимать дополнительные от нуля до трех байт, если у него есть дробная часть секунд. Но, как правило, хранят просто целые секунды, и она занимает пять байт. Допустимый диапазон от 1000-го года до 9999-го года, плюс время. Также существует тип DATE, который очень похож на DATETIME, но только не хранит время. Диапазон там такой же, и занимает он в базе три байта. Также есть тип TIMESTAMP, он очень похож на DATETIME в том смысле, что он хранит тоже дату и время, занимает четыре байта, плюс от нуля до трех байт для дробной части секунд, если они есть. У него немножко другой диапазон. Он может хранить от 1970-го года до 2038-го года. И внутри себя он хранит количество секунд, прошедших с 1 января 1970-го, и хранит он их в часовой зоне UTC. Если у вас в MySQL установлена ваша таймзона другая, то при записи вашего времени, оно конвертируется в UTC, а при чтении конвертируется обратно. Поэтому если записать какое-то значение, а потом изменить настройки MySQL, можно прочитать совершенно другое. Вот такой вот нюанс. Формат, в котором может быть записана дата в MySQL, может представлять год из четырех или из двух цифр, месяц и день, а также часы, минуты, секунды, и между ними могут быть любые разделители, абсолютно любые, можно ставить дефисы между частями года и двоеточия между частями времени, а можно и вообще любые другие символы. Также дату от времени можно разделить буквой T, а вот дробную часть секунд от основных секунд можно отделить только точкой. Также можно указывать дату и время цифрами вообще сплошняком без каких бы то ни было разделителей. Если вы укажете дату, которой не существует, попытаетесь её сохранить в MySQL, то, в зависимости от настроек, у вас получится либо ошибочная дата, которая будет представлена когда-то, в которой все цифры являются нулями, либо, если включён строгий режим, то будет ошибка. Также, давайте поговорим, если вы захотите сохранять год, передавать только две цифры года, то если это будут цифры от 0 до 69, то будут иметься в виду года от 2000-го до 2069-го. Если вы будете передавать цифры от 70 до 99, то это будет означать год от 1970-го до 1999-го. Но лучше всегда передавать четыре цифры. Также типы TIMESTAMP и DATETIME, которые, как мы знаем, могут хранить дату и одновременно время, могут автоматически инициализироваться или обновляться текущим временем. Это достаточно удобно для хранения каких-то значений, которые должны быть, например, даты последнего изменения записи. То есть при изменении записи какая-то из её колонок будет автоматически устанавливаться текущим временем, и вы сможете понять, когда запись в последний момент изменялась. Также существует тип TIME для хранения, как вы понимаете, только времени. А точнее, не времени в пределах дня, а какого-то временного интервала, скорее. Занимает в памяти три байта плюс дробная часть, которая до трех, дробная часть секунд, и может хранить от −838 часов до +838 часов. Плюс минуты, секунды. Соответственно, может записываться тоже в разных форматах, как с указанием трёх цифр для часов, минут и секунд, также с указанием дней через пробел перед часами для большего удобства. Ну и допускаются также какие-то сокращённые форматы, где можно опускать либо дни, либо часы, минуты, и оставлять, например, можно даже просто указать количество секунд. Также допускается вариант записи без каких бы то ни было разделителей, как и во всех таких типах. Также существует тип данных YEAR, который позволяет хранить только год от 1901-го до 2155-го, и занимает в базе этот тип один байт. Давайте подведём итоги занятия. В этом видео мы рассмотрели числовые типы данных, которые делятся на целочисленные и дробные, а дробные в свою очередь делятся на с фиксированной точкой и с плавающей точкой, а также тип BIT для хранения битовых значений. И рассмотрели с вами типы данных для хранения даты и времени. А в следующем видео мы рассмотрим строковые типы данных и тип данных JSON. [ЗВУК] [БЕЗ_ЗВУКА]