前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL datetime 类型精度设置踩坑

MySQL datetime 类型精度设置踩坑

作者头像
wayn
发布于 2025-05-26 03:35:43
发布于 2025-05-26 03:35:43
21200
代码可运行
举报
文章被收录于专栏:wayn的程序开发wayn的程序开发
运行总次数:0
代码可运行

数据库设计与开发过程中,时间类型的精度问题常常是引发数据错误的“隐形炸弹”。MySQLdatetime 类型作为常见的日期时间存储字段,其默认行为和精度设置对业务逻辑的影响尤为关键。

本文也是作者实际踩坑后结合实际案例,深入剖析 datetime 类型的精度问题,并提供解决方案和最佳实践。

一、datetime 类型的精度问题

1.1 默认精度限制

MySQL 的 datetime 类型默认仅精确到秒级(即不包含毫秒或微秒)。例如,插入值 2025-05-26 10:14:59.999 时,实际存储的值会被截断为 2025-05-26 10:15:00。这种行为在 MySQL 5.6.4 之前的版本中尤为常见,即使字段名显示为 datetime,实际存储时也会丢失小数部分的精度。

1.2 四舍五入与进位问题

当插入的毫秒值超过 0.5 秒时,MySQL 会自动进位。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSERT INTO t_user (join_time) VALUES ('2025-05-26 10:14:59.765');

若字段未声明精度(即 datetime 而非 datetime(3)),存储结果将变为 2025-05-26 10:15:00,而非预期的 2025-05-26 10:14:59.765。这种行为可能导致业务逻辑中的时间计算错误(如订单超时判断、日志时间戳分析等)。

1.3 实际案例:毫秒级精度丢失引发的业务异常

某电商平台在处理订单结算时,发现部分订单的 end_time 字段在插入 TiDB 后,值从 2022-11-03 23:59:59.999 被进位为 2022-11-04 00:00:00。由于系统依赖此字段判断订单是否在当日有效,最终导致大量订单被错误标记为“过期”,造成客户投诉和财务损失。

二、问题根源分析

2.1 MySQL 版本差异

MySQL 5.6.4 之前datetime 类型不支持毫秒精度,插入值的小数部分会被直接丢弃或四舍五入。

MySQL 5.6.4 及之后:支持通过 datetime(fsp) 设置精度,其中 fsp 表示小数秒位数(0-6),例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE t_user (
    join_time DATETIME(3)  -- 精确到毫秒
);

2.2 客户端工具的显示误导

某些常用的客户端工具(如 Navicat)在设计表时默认将 datetime 的精度默认设置为 0,稍不注意就会踩坑。这种设计缺陷容易导致开发者误以为字段支持高精度存储。

没错,说的就是我 😂

2.3 时区与跨数据库兼容性

datetime 类型存储的是绝对时间(不包含时区信息),而 timestamp 类型会自动转换为当前会话的时区。在跨数据库迁移(如 MySQL 到 TiDB)时,若未统一时区设置,可能导致时间解析错误。

三、解决方案与最佳实践

3.1 显式声明精度

在设计表时,应根据业务需求显式声明 datetime 的精度

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ALTER TABLE t_user MODIFY join_time DATETIME(3);  -- 精确到毫秒
  • DATETIME(0):秒级精度(默认)。
  • DATETIME(3):毫秒级精度(3 位小数)。
  • DATETIME(6):微秒级精度(6 位小数)。

3.2 使用 TIMESTAMP 替代方案

若业务对时区敏感且需高精度,可考虑使用 TIMESTAMP 类型(支持毫秒级精度):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ALTER TABLE t_user MODIFY join_time TIMESTAMP(3);

但需注意 TIMESTAMP 的存储范围较小(1970-01-01 至 2038-01-19),且受服务器时区影响。

3.3 Java 中 Date 类型支持

Java 中 Date 类型默认支持毫秒级时间

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Date now = new Date();
System.out.println(DateUtil.format(now, "yyyy-MM-dd HH:mm:ss.SSS"));
输出:2025-05-26 10:39:15.002

而如果 MySql 中 datetime 类型没有设置精度,就很容易遇到 datetime 类型的自动进位问题,也是建议大家搭配 datetime(3),避免此问题。

四、性能与兼容性优化

4.1 索引优化

datetime 字段上创建索引时,需注意:

  • 避免全表扫描:对范围查询(如 WHERE join_time BETWEEN ...)使用索引。
  • 分区表:对大表按时间分区,提升查询效率。

4.2 时区一致性

尽量在代码层统一处理时区转换,避免依赖数据库的自动转换。

4.3 跨数据库兼容性

  • 在迁移数据库时(如 MySQL 到 TiDB),需验证目标数据库是否支持 datetime(fsp) 语法。
  • 对于 TiDB,需升级到 5.4 及以上版本以支持 DATETIME(6)

五、总结

MySQL 数据库设计中,应显式声明 datetime 精度、验证版本兼容性与工具链一致性,并通过开文档化时区策略与测试环境模拟,系统性规避时间精度陷阱,确保业务逻辑的稳定性和数据准确性。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-05-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 waynblog 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2025最新OpenEuler系统安装MySQL的详细教程
通过上述步骤,你已经成功在OpenEuler系统上安装并启用MySQL,同时可选配置防火墙和远程连接。
猫头虎
2025/06/14
1040
2025最新OpenEuler系统安装MySQL的详细教程
MySQL root密码忘记,原来还有更优雅的解法!
一直以来,对于MySQL root密码的忘记,以为只有一种解法-skip-grant-tables。
星哥玩云
2022/08/16
3250
MySQL 安装教程
卸载 mysql (下面是卸载 mysql 的库,防止产生冲突,mysql 也是类似卸载方式)
程序员波特
2024/01/27
1630
MySQL 安装教程
centOS7安装MySQL流程介绍
1、隐藏密码 如:MySQL 连接远程数据库(192.168.5.116),端口“3306”,用户名为“root”,密码“123456”(这是我乱写的地址哈) C:/>mysql -h 192.168.5.116 -u root -p Enter password:
麦克劳林
2018/09/11
9020
centOS7安装MySQL流程介绍
Ubuntu安装配置MySQL
注:建议将/etc/apt/source.list中的cn改成us,美国的服务器比中国的快很多,修改命令如下:sudo sed -i "s/cn/us/g" sources.list
阳光岛主
2019/02/19
2.5K0
mysql 管理指令
1、sed -n "22,25p" /etc/init.d/mysqld 2、三种关闭mysql的方式 service mysqld stop kill pidxx mysqladmin xx shutdown 3、更换配置文件启动 mysqld_safe --defaults-file=/data/xx/my.cnf 2>&1 >/dev/null & 4、mysql几个常用软件 mysql, mysqladmin , mysqldump , mysqlbinlog 5、连接方式 mysql -h -u -p -P mysql -u -p -S /xx/x.sock 6、删除历史命令 history -d 211 history -c 清除 7、配置文件设置权限 600 8、退出 : quit/exit 9、msyql初始化安全设置 delete from mysql.user; grant all privileges on . to myroot@'localhost' identified by 'pass' with grant option; flush privileges; 10、修改密码 mysqladmin -uroot -p password xxx set password for root@localhost=password('xxx') update user set password=password('123') where user='root' and host='localhost'; alter user 'root'@'localhost' IDENTIFIED BY 'liuhehe';
用户5760343
2019/11/12
1.2K0
MYSQL介绍安装及一些问题解决
一、简介 MySQL是最流行的开放源码SQL数据库管理系统,它是由MySQL AB公司开发、发布并支持的。有以下特点: MySQL是一种数据库管理系统。 MySQL是一种关联数据库管理系统。 MySQL软件是一种开放源码软件。 MySQL数据库服务器具有快速、可靠和易于使用的特点。 MySQL服务器工作在客户端/服务器模式下,或嵌入式系统中。 有大量可用的共享MySQL软件。 MySQL表最大能达到多少? InnoDB存储引擎将InnoDB表保存在一个表空间内,该表空间可由数个文件创建。这样,表的大小就能超
程序员同行者
2018/06/22
6340
MariaDB/MySQL用户和权限管理详解
MariaDB/MySQL中的user由用户名和主机名构成,如"root@localhost",同用户名但不同主机名对MySQL/MariaDB来讲是不同的,也就是说"root@localhost"和"root@127.0.0.1"是不同的用户,尽管它们都是本机的root。
星哥玩云
2022/08/16
1.7K0
MariaDB/MySQL用户和权限管理详解
MySQL配置主从复制
参考如下几篇博客:1:https://stackoverflow.com/questions/2995054/access-denied-for-user-rootlocalhost-using-passwordno
用户5927264
2019/08/01
1K0
MySQL配置主从复制
第三章·MySQL版本区别及管理
*.* [当前MySQL实例中所有库下的所有表] wordpress.* [当前MySQL实例中wordpress库中所有表(单库级别)] wordpress.user [当前MySQL实例中wordpress库中的user表(单表级别)]
DriverZeng
2022/09/26
3380
第三章·MySQL版本区别及管理
linux下使用yum安装mysql
            # yum install -y mysql-server
帘卷西风
2018/08/03
2.9K0
MYSQL常用命令
mysql>select host, user, password from user;
以谁为师
2019/05/28
1.5K0
centos6上使用yum方式安装MySQL
仓库源都给你了,还想怎样?https://dev.mysql.com/downloads/repo/yum/
JaneYork
2023/10/11
1.1K0
centos6上使用yum方式安装MySQL
新手学Linux(八)----MySql安装(Centos7)
最近项目新申请了云服务器,老大让我搭了下环境,在安装MySql的时候遇到的坑稍微多点,所以在这里做个记录,我的安装方式不是通过安装包来安装的,而是通过yum来安装的,这样倒是可以省去很多的事情,下面来说说具体的安装过程。
令仔很忙
2018/09/14
6640
Linux上安装MySQL及其基础配置
本文主要介绍Linux下使用yum安装MySQL,以及启动、登录和远程访问MySQL数据库。 1、安装 查看有没有安装过: yum list installed mysql* rpm -qa | grep mysql* 查看有没有安装包: yum list mysql* 安装mysql客户端: yum install mysql 安装mysql 服务器端: yum install mysql-server yum install mysql-devel 2、启动    &&    停止 数据库字符集设置
人生不如戏
2018/05/30
1.1K0
yum 安装卸载mysql_yum 安装卸载mysql
mysql配置文件/etc/my.cnf中加入default-character-set=utf8
全栈程序员站长
2022/08/31
2.3K0
CentOS 6.5之LAMP学习笔记
Ubuntu 13.04 安装 LAMP\Vsftpd\Webmin\phpMyAdmin 服务及设置 http://www.linuxidc.com/Linux/2013-06/86250.htm
星哥玩云
2022/06/30
3100
Linux CentOS7 (Windows)系统安装 MySQL
优秀博客: https://blog.csdn.net/jubincn/article/details/6725582 http://www.runoob.com/mysql/mysql-install.html
zoro
2019/04/11
7700
Centos 6.x 安装配置MySQL
service mysqld start chkconfig mysqld on
程裕强
2022/05/06
3800
Linux安装 Mysql
背景 前不久开始学习部署ambari,在安装mysql的时候遇到了点问题,现在从网上找了点部署流程记录下来便于以后安装mysql。 Centos 7.2 安装 Mysql 5.7.13 首先要安装yum,如下: wget http://yum.baseurl.org/download/x.x/yum-x.x.x.tar.gz tar xvf yum-x.x.x.tar.gz cd yum-x.x.x yummain.py install yum 以上为记忆中的大致流程。 1. 下载mysql的repo源
用户1217611
2018/01/30
2.8K0
Linux安装 Mysql
相关推荐
2025最新OpenEuler系统安装MySQL的详细教程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验