unix_timestamp (MySQL) 的数据类型是啥?
Posted
技术标签:
【中文标题】unix_timestamp (MySQL) 的数据类型是啥?【英文标题】:What is the data type for unix_timestamp (MySQL)?unix_timestamp (MySQL) 的数据类型是什么? 【发布时间】:2011-05-06 18:32:18 【问题描述】:我应该使用什么数据类型来保存 unix_timestamp
值 (mysql)?
【问题讨论】:
dev.mysql.com/doc/refman/5.0/en/datetime.html 时间戳和unix_timestamp一样吗? @user239431:UNIX_TIMESTAMP 是一个 MySQL 函数:dev.mysql.com/doc/refman/5.1/en/… @user239431 不,不是。 unix_timestamp 它返回自 '1970-01-01 00:00:00' 以来的秒数和 (mysql) 时间戳记一个 YYYYMMDDHHMMSS 或 YYMMDDHHMMSS 格式的数字。如果您的应用程序中确实需要时间戳(unix),您可以使用 NOW() 保存当前日期时间并使用 UNIX_TIMESTAMP() 返回 unix_timestap,并且仍然拥有 MySQL 日期函数的全部功能,请参阅dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html 也值得一读dev.mysql.com/doc/refman/5.1/en/… 【参考方案1】:类型是整数,如:
int(11)
适用于索引和条件,如> < =
【讨论】:
如果您使用 INT,您需要记住签名版本仅从 -2147483648 到 2147483647,上限触发year 2038 bug。您可以使用 INT(11) UNSIGNED 或 BIGINT - 后者有 some caveats,但它是 massive。我个人觉得 MySQL 的内置函数更安全,但大型数据集的索引和比较函数可能会影响你。 为了后代我 +1 William Turrell 的评论。从我的角度来看,UNSIGNED INT 将是可行的方法,但最真实的答案将取决于您将数据库信息提取到的语言(如果从头开始编码)。示例:如果您是 Java 商店,UNSIGNED INT 映射到 java.lang.Long(请参阅此处的表 5.2,MySQL + Java 用户:dev.mysql.com/doc/connector-j/en/…)。这样,您可以在数据库中节省一些空间,同时确保您不会编写会在 2038 年遇到错误的代码。好点@WilliamTurrell。 就 2038 漏洞而言,将int(11)
中的 11 增加到 12 或 13 不是避免这种情况的合理措施吗?
@BradHein 11 是或显示,而不是可以存储的大小。 UNSIGNED int 的最大值始终为 4294967295。请参阅dev.mysql.com/doc/refman/5.7/en/integer-types.html。将该数字输入一个纪元转换器,然后查看该字段可以保存大约 2106 年 2 月 7 日的日期。epochconverter.com/…
可以存储的时间是 unsigned 标志的两倍。 2038-1970=68 年,2106-1970=136 年。【参考方案2】:
您想使用TIMESTAMP data type。 它存储为一个纪元值,但 MySQL 将该值显示为 'YYYY-MM-DD HH:MM:SS'。
【讨论】:
我相信问题是询问哪种 MySQL 数据类型最适合存储 epoch 值。 TIMESTAMP 不是这里的答案,因为 TIMESTAMP 唯一可接受的值是月/日/年字符串。来源:dev.mysql.com/doc/refman/8.0/en/date-and-time-literals.html【参考方案3】:MySql DateTime 数据类型以 'YYYY-MM-DD HH:MM:SS' 格式存储日期,范围从 '1000-01-01 00:00:00' 到 '9999- 12-31 23:59:59'。
MySql TIMESTAMP 数据类型以 'YYYY-MM-DD HH:MM:SS' 格式存储日期,范围从 '1970-01-01 00:00:01' UTC 到 '2038 -01-19 03:14:07' UTC。
Unix TIMESTAMP 是自 1970-01-01
以来的秒数,如果您想将 unix Timestamp 存储在 mysql
db 中,您应该使用带有属性 UNSIGNED
的 int(11)
(仅允许正数),如果你想保存微秒数,你应该使用bigint(20)
,..
如果您想在选择查询中以可读格式获取unixtimestamp
你可以使用
SELECT FROM_UNIXTIME(CAST(yourtable.start_time as UNSIGNED)) as date_time
如果您使用的是php
,您可以使用:
$unixtimestamp= time();//1544619186
echo(date("Y-m-d", $unixtimestamp));//2018-12-12
如果您想在 Javascript 中使用 本地时区 显示日期时间,请使用此功能
function timeConverter(UNIX_timestamp)
var date = new Date(UNIX_timestamp*1000);
var year = date.getFullYear();
var month = ("0"+(date.getMonth()+1)).substr(-2);
var day = ("0"+date.getDate()).substr(-2);
var hour = ("0"+date.getHours()).substr(-2);
var minutes = ("0"+date.getMinutes()).substr(-2);
var seconds = ("0"+date.getSeconds()).substr(-2);
return year+"-"+month+"-"+day+" "+hour+":"+minutes+":"+seconds;
console.log(timeConverter(value));// 2018-14-12 13:11:33
(在这种情况下,服务器应按原样返回 unixTimestamp:
SELECT yourtable.start_time as date_time
)
【讨论】:
【参考方案4】:BIGINT UNSIGNED NOT NULL
以秒为单位的纪元表示可以适应INT(11)
如果时间戳有毫秒,可以使用INT(20)
。
【讨论】:
以上是关于unix_timestamp (MySQL) 的数据类型是啥?的主要内容,如果未能解决你的问题,请参考以下文章
解析mysql中UNIX_TIMESTAMP()函数与php中time()函数的区别
mysql 时间戳函数FROM_UNIXTIME和UNIX_TIMESTAMP函数的使用说明
MySQL中from_unixtime和unix_timestamp处理数据库时间戳转换问题-案例