mysql用int做时间戳存储的来看看吧,有你不知道的坑!

database

问题:

       公司项目中mysq数据库用int(11)来存储日期的时间戳格式,可本人在严格模式(Strict Mode)测试中发现在2038-01-19 11:14:07以后的日期无法存储,提示字段超出范围(Out of range value for column)。

分析:

       字段类型int,长度11,带符号型。我们平时知道int的长度与存放的数值型的数的大小无关 ,也就是int(1)与int(11)存储的数值大小是一样的,所以关键要去查询int数值最大是多少。

       以下是每个整数类型的存储和范围(来自mysql手册)

类型

字节

最小值

最大值

 

 

(带符号的/无符号的)

(带符号的/无符号的)

TINYINT

1

-128

127

 

 

0

255

SMALLINT

2

-32768

32767

 

 

0

65535

MEDIUMINT

3

-8388608

8388607

 

 

0

16777215

INT

4

-2147483648

2147483647

 

 

0

4294967295

BIGINT

8

-9223372036854775808

9223372036854775807

 

 

0

18446744073709551615

结论:

        有符号的int类型最大值2147483647,转成日期为2038-01-19 11:14:07,如果想存储2038-01-19 11:14:07往后的日期可以将字段改成unsigned,unsigned 是表示无符号数据类型,也就是非负数,因此对整数的表示范围扩大了1倍,无符号的int最大值为 4294967295 (转换时间为2106-02-07 14:28:15)目前可以满足需要。

附言:

        至于为什么用int作为日期时间的存储类型而不用datetime呢,int做时间戳有什么优缺点呢?

优点:

        1、int存储空间小,排序查询效率比datetime高。
        2、方便时间计算很好规避了时区问题。
        3、格式化在php,方便日期格式转换。
缺点:
        1,int日期范围有限制(0的时间戳转换为1970-01-01 08:00:00),可用bigint代替,而datetime支持的范围为"1000-01-01 00:00:00"到"9999-12-31 23:59:59"。
        2,可读性极差,无法直观的看到数据。

 

以上是 mysql用int做时间戳存储的来看看吧,有你不知道的坑! 的全部内容, 来源链接: utcz.com/z/532868.html

回到顶部