当前位置:   article > 正文

mysql存时间戳报错 Out of range value for column ‘create_time‘ at row 1_timestamp out of range

timestamp out of range

问题描述:

前端通过 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;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/632507
推荐阅读
相关标签
  

闽ICP备14008679号