問題:
MySQL5.6 版本。datetime 字段類型支持6位毫秒級別。
當從5.5升級以后,插入的值可能會被四舍五入(太坑!!!)
# 實例1, MySQL 5.6
CREATE TABLE szy (
`id` int(11) NOT NULL AUTO_INCREMENT,
`gmt_create` datetime DEFAULT NULL, #5.6 版本 定義格式為 date time(6) ,保留6位毫秒數值。不加表示不保留毫秒
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
> insert into szy select 1,'2018-08-28 23:59:59.999';
> select * from szy;
+----+---------------------+
| id | gmt_create |
+----+---------------------+
| 1 | 2018-08-29 00:00:00 |. # 字段值變了!!!
+----+---------------------+
1 row in set (0.00 sec)
# 實例2,MySQL5.6
CREATE TABLE szy (
`id` int(11) NOT NULL AUTO_INCREMENT,
`gmt_create` datetime(3) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
> insert into szy select 1,'2018-08-28 23:59:59.999';
> insert into szy select 2,'2018-08-28 23:59:59.999999';
> insert into szy select 3,'2018-08-28 23:59:59';
> select * from szy;
+----+-------------------------+
| id | gmt_create |
+----+-------------------------+
| 1 | 2018-08-28 23:59:59.999 |
| 2 | 2018-08-29 00:00:00.000 | # 又變了!!!
| 3 | 2018-08-28 23:59:59.000 |
+----+-------------------------+
3 rows in set (0.00 sec)
> select * from szy where gmt_create='2018-08-28 23:59:59'; #查詢還有精確度要求
+----+-------------------------+
| id | gmt_create |
+----+-------------------------+
| 3 | 2018-08-28 23:59:59.000 |
+----+-------------------------+
總結:
1、MySQL 5.6 版本 datetime 最多支持6位毫秒,設置幾位,業務在寫入時候,就要寫幾位。不能比設置的位數多,否則會出現四舍五入的情況。
2、查詢有精確度限制。