MySQL поддерживает дробные части секунд начиная с версии 5.6.4, которая была выпущена в конце 2011 года. В запросах CREATE TABLE и ALTER TABLE вы можете указать для полей типа TIME, DATETIME и TIMESTAMP количество знаков после запятой, которые нужно хранить.

Пример:

Test> CREATE TABLE `Users` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `name` VARCHAR(255) NOT NULL,
  created TIMESTAMP(2) NOT NULL
) ENGINE=InnoDB CHARSET=utf8mb4;
Query OK, 0 rows affected (0.03 sec)

Test> INSERT INTO Users (name, created) VALUES ('Victor', NOW());
Query OK, 1 row affected (0.00 sec)

Test> SELECT * FROM Users;
+----+--------+------------------------+
| id | name   | created                |
+----+--------+------------------------+
|  1 | Victor | 2019-03-03 17:00:09.00 |
+----+--------+------------------------+
1 row in set (0.00 sec)

Вы можете хранить от 1 до 6 знаков после запятой. При попытке использовать большее количество вы получите ошибку:

Test> ALTER TABLE `Users` MODIFY created TIMESTAMP(9) NOT NULL;
ERROR 1426 (42000): Too-big precision 9 specified for 'created'. Maximum is 6.

Test> ALTER TABLE `Users` MODIFY created TIMESTAMP(3) NOT NULL;
Query OK, 1 row affected (0.03 sec)
Records: 1  Duplicates: 0  Warnings: 0

MySQL округляет переданные значения до точности, указанной в описании колонки, и это изменение точности не порождает никакого предупреждения:

Test> UPDATE Users SET created="2019-03-03 17:00:09.1" WHERE id=1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

[localhost] test> SELECT * FROM Users;
+----+--------+-------------------------+
| id | name   | created                 |
+----+--------+-------------------------+
|  1 | Victor | 2019-03-03 17:00:09.100 |
+----+--------+-------------------------+
1 row in set (0.00 sec)

Test> UPDATE Users SET created="2019-03-03 17:00:09.2345" WHERE id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

[localhost] test> SELECT * FROM Users;
+----+--------+-------------------------+
| id | name   | created                 |
+----+--------+-------------------------+
|  1 | Victor | 2019-03-03 17:00:09.235 |
+----+--------+-------------------------+
1 row in set (0.00 sec)

При использовании автоматической инициализации и обновления колонок типа TIMESTAMP с помощью конструкции вида DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP важно, чтобы значения имели ту же самую точность, что и сама колонка:

Test> ALTER TABLE Users ADD COLUMN updated TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
ERROR 1067 (42000): Invalid default value for 'updated'
Test> ALTER TABLE Users ADD COLUMN updated TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6);
ERROR 1067 (42000): Invalid default value for 'updated'

Test> ALTER TABLE Users ADD COLUMN updated TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3);
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0

Test> UPDATE Users SET created='2019-03-03 17:00:09' WHERE id=1;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0

Test> SELECT * FROM Users;
+----+--------+-------------------------+-------------------------+
| id | name   | created                 | updated                 |
+----+--------+-------------------------+-------------------------+
|  1 | Victor | 2019-03-03 17:00:09.000 | 2019-03-03 17:16:39.193 |
+----+--------+-------------------------+-------------------------+
1 row in set (0.00 sec)

Смотри также: