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 中,您应该使用带有属性 UNSIGNEDint(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处理数据库时间戳转换问题-案例

MySQL中from_unixtime和unix_timestamp处理数据库时间戳转换问题-案例

MYSQL int型日期处理

mysql 字符串转换呈毫秒值