博客
关于我
Mysql 数据类型一日期
阅读量:796 次
发布时间:2023-02-10

本文共 2296 字,大约阅读时间需要 7 分钟。

MySQL 中的 DATETIMETIMESTAMP 类型是存储时间数据的两种常用类型,但它们在存储机制、格式化输出以及时区处理上存在显著差异。本文将详细解析这两种类型的特点及其适用场景。

DATETIME 类型

从 MySQL 5.6 版本开始,DATETIME 类型引入了毫秒的支持。其存储格式为 YYYY-MM-DD HH:MM:SS[.mmm],默认不显示毫秒部分。DATETIME(6) 表示可以存储到毫秒的精度。这种类型的特点是按实际输入格式存储,与时区无关。例如,输入的日期格式即为存储格式,无需考虑时区转换。

DATETIME 的优点在于其灵活性和广泛的日期范围(从 1000-01-01 00:00:009999-12-31 23:59:59)。它通常存储为 8 字节,支持自动初始化当前时间,并且可以设置为在更新时自动更新。例如,可以在用户表中定义注册日期和最后修改日期:

CREATE TABLE User (    id BIGINT NOT NULL AUTO_INCREMENT,    name VARCHAR(255) NOT NULL,    sex CHAR(1) NOT NULL,    password VARCHAR(1024) NOT NULL,    money INT NOT NULL DEFAULT 0,    register_date DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),    last_modify_date DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),    CHECK (sex = 'M' OR sex = 'F'),    PRIMARY KEY (id));

TIMESTAMP 类型

TIMESTAMP 类型的设计目标是存储事件发生的具体时间,其内部存储形式为从 1970-01-01 00:00:00 到当前时间的毫秒数。与 DATETIME 不同的是,TIMESTAMP 的存储大小为 4 字节(MySQL 中),因此其最大存储值为 2038-01-19 03:14:07。从 MySQL 5.6 开始,TIMESTAMP 也支持毫秒精度,但其存储大小会根据是否包含毫秒信息而增加。

TIMESTAMP 的主要优势在于其可选的时区属性。它本质上是从 Unix 时间戳转换而来,支持设定具体的时区(如 +08:00America/Los_Angeles)。这种时区支持使 TIMESTAMP 在处理夏令时和跨时区业务时尤为出色。例如,新闻发布时间可以根据用户所在时区自动转换为当地时间。

DATETIME vs TIMESTAMP vs INT:选择建议

  • DATETIME:适用于需要存储完整日期和时间的场景,且不受时区转换的限制。
  • TIMESTAMP:适用于记录事件发生的具体时间,尤其是需要时区支持的业务场景。
  • INT(作为时间戳):如果需要快速的时间比较或跨数据库系统的一致性,Unix 时间戳是一个合适的选择。

时间戳转换

在实际应用中,需要进行时间戳转换操作。unix_timestamp() 函数可以将 DATETIME 转换为 Unix 时间戳,而 FROM_UNIXTIME() 函数则将其转换回标准时间格式:

INSERT INTO test (timestr) VALUES (unix_timestamp(current_timestamp));SELECT FROM_UNIXTIME(timestr) FROM test;

TIMESTAMP 的性能问题

尽管 TIMESTAMP 类型支持时区,但其性能可能不如 DATETIME。特别是在大规模并发访问时,由于时区转换涉及操作系统底层函数,可能会引入性能瓶颈。因此,建议显式设置时区,而不是依赖操作系统时区:

[mysqld]time_zone = "+08:00"

表结构设计规范

在数据库设计中,建议为核心业务表添加 DATETIME 类型的 last_modify_date 字段,并设置自动更新机制。例如,用户表中的 last_modify_date 字段可以自动更新为当前时间:

CREATE TABLE User (    id BIGINT NOT NULL AUTO_INCREMENT,    name VARCHAR(255) NOT NULL,    sex CHAR(1) NOT NULL,    password VARCHAR(1024) NOT NULL,    money INT NOT NULL DEFAULT 0,    register_date DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),    last_modify_date DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),    CHECK (sex = 'M' OR sex = 'F'),    PRIMARY KEY (id));

通过以上分析,可以更好地理解 DATETIMETIMESTAMP 的特点及其适用场景,从而在实际业务中做出合适的类型选择。

转载地址:http://iybfk.baihongyu.com/

你可能感兴趣的文章
mysql5.7安装
查看>>
mysql5.7性能调优my.ini
查看>>
MySQL5.7新增Performance Schema表
查看>>
Mysql5.7深入学习 1.MySQL 5.7 中的新增功能
查看>>
Webpack 之 basic chunk graph
查看>>
Mysql5.7版本单机版my.cnf配置文件
查看>>
mysql5.7的安装和Navicat的安装
查看>>
mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
查看>>
Mysql8 数据库安装及主从配置 | Spring Cloud 2
查看>>
mysql8 配置文件配置group 问题 sql语句group不能使用报错解决 mysql8.X版本的my.cnf配置文件 my.cnf文件 能够使用的my.cnf配置文件
查看>>
MySQL8.0.29启动报错Different lower_case_table_names settings for server (‘0‘) and data dictionary (‘1‘)
查看>>
MYSQL8.0以上忘记root密码
查看>>
Mysql8.0以上重置初始密码的方法
查看>>
mysql8.0新特性-自增变量的持久化
查看>>
Mysql8.0注意url变更写法
查看>>
Mysql8.0的特性
查看>>
MySQL8修改密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
查看>>
MySQL8修改密码的方法
查看>>
Mysql8在Centos上安装后忘记root密码如何重新设置
查看>>
Mysql8在Windows上离线安装时忘记root密码
查看>>