赞
踩
前端通过 Date.now() 取得时间戳(13位,精确到毫秒,形如1607048228655),
数据库:mysql,存储字段 create_time,`create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间(戳)',
前端拿到时间戳后存到数据库时报错:
Error: ER_WARN_DATA_OUT_OF_RANGE: Out of range value for column 'create_time' at row 1
报错信息很明确:create_time 列的值超出范围
mysql中 int 类型存储是有范围限制的,
有符号的范围是-2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型数据(所有数字),无符号的范围是0到4294967295。一位大小为 4 个字节。
很明显,前端取到的 13位精确到毫秒的时间戳超出了这个范围,导致报错。
首先要明确一点,把create_time字段的类型从 int(10) 改成 int(13)甚至是 int(20)都是 不可以的!
为什么不行呢?int(10)存不下,那我长度加大点,int(20)总存的下吧?(哈哈哈,开始我就是这么想的,甚至一度怀疑自己mysql出了问题)
还是因为对mysql的 int 类型不理解,实际上,int类型声明中括号中的数字为显示宽度,它与可以存储在数据类型中的值的范围无关。仅仅因为你可以声明Int(20)
并不意味着您可以在其中存储最多10^20的值:
1. 入库前先将数据处理下,保存10位,精确到秒 即可,除非特殊需要,99.9%的需求是没必要精确到 毫秒的;
2.剩下 0.1% 必须要求精确到毫秒,那就更改mysql字段的int(10) 为 datetime/bigint(20)等类型:(如下)
> ALTER TABLE blog modify column create_time datetime;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。