В дополнение к календарным типам, предназначенным для хранения даты и времени отдельно, MySQL также поддерживает гибридные типы данных DATETIME и TIMESTAMP, предназначенные для хранения дат и времени в виде компонентов одного значения. Использование этих типов продемонстрировано в следующем примере.
Типы DATETIME и TIMESTAMP
Типы DATETIME и TIMESTAMP
Эти два типа чаще всего используются для хранения временных отметок, одновременно содержащих информацию о текущем времени и дате, и они также могут пригодиться для приложений, которые выполняют большое количество транзакций с базой данных, и когда требуется хранить временные отметки для отладки или анализа работы системы.
MySQL автоматически заносит в первое поле, объявленное в записи как TIMESTAMP текущую дату и временя, если явно не задано никакого значения для этого поля, или если для этого поля задано значение NULL. Следующий пример наглядно демонстрирует этот эффект.
Типы DATETIME и TIMESTAMP
Эквивалентного результата можно добиться, использовав функцию MySQL NOW() для заполнения текущей даты и времени в поле, объявленном с типом DATETIME.
Типы DATETIME и TIMESTAMP
Эти прекрасные невидимые временные метки!
Существует возможность управлять размером поля TIMESTAMP с помощью спе­цификатора длины, аналогично тому, как это делается с числовыми типами. Следующая таблица перечисляет различные размеры и соответствующие им форматы2.
Типы DATETIME и TIMESTAMP
Следует заметить, что несмотря на то, что MySQL разрешает использование нестандартных форматов TIMESTAMP, пользоваться ими следует ограниченно. Причина лежит на поверхности: MySQL не имеет возможности использовать в ключах поля TIMESTAMP нестандартных форматов. Форматирование вывода можно получить с помощью функции DATE_FORMAT(), речь о которой пойдет в следующей главе.
Использование модификатора длины отображения поля TIMESTAMP никак не влияет на реальный размер поля или диапазон значений, которые он может сохранять. Задайте сначала короткую длину отображения поля TIMESTAMP, а потом попробуйте увеличить его с помощью команды ALTER TABLE, и вы увидите, как станет видимой ранее скрытая информация. Например:
mysql> CREATE TABLE data (when TIMESTAMP(6));
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO data VALUES (NULL);
Query OK, 1 row affected (0.06 sec)
Типы DATETIME и TIMESTAMP
Типы DATETIME и TIMESTAMP
Такие значения могут проскочить мимо недремлющего ока MySQL, т.к. разработчики MySQL не предусмотрели всесторонней проверки для значений даты и времени. В чем причина? Проверка значений даты и времени все-таки считается задачей прикладного уровня, и поэтому считается нецелесообразным перегружать MySQL всеми мыслимыми и немыслимыми проверками при каждом вводе даты.