Работа с дробными частями секунд в MySQL
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)