数据库用int存储时间戳问题
超过int范围就不行了。
最大范围是 2038 年,太小的也不行,所以不太合理。
只能说一定情况下可用 int ,直接用 bigint 会更好。
字段类型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,可读性极差,无法直观的看到数据。
文章作者: 朱丰华
文章链接: https://smart.52dixiaowo.com/blog/post-287.html
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。