MySQL关于timestamp和mysqldump的一个“bug”

复现

来源于一个同事在做数据转储碰到的的问题,简化如下:

1、建表

drop table if exists tb;

CREATE TABLE tb (

  c timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'

) ENGINE=InnoDB DEFAULT CHARSET=gbk;

insert into tb values(now());

select * from tb;

 

返回

mysql> select * from tb;

+---------------------+

| c                   |

+---------------------+

| 2012-12-14 00:42:45 |

+---------------------+

1 row in set (0.00 sec)

 

2、dump“出错”

  mysqldump   -Srun/mysql.sock -uroot   test tb   --where='c="2012-12-14 00:42:45"' | grep INSERT

返回为空,也就是说导不到数据。

 

 

分析

从上面的结论看上去,似乎是mysqldump的”bug”,看得到的数据都导不出来。 如果我们先不加where条件,

mysqldump   -Srun/mysql.sock -uroot   test tb    |grep INSERT                         

INSERT INTO `tb` VALUES ('2012-12-13 16:42:45');

 

接下来我们要说说关于timestamp这个字段类型。

首先,从大小上你可以看出来,它不是个字符串,实际上是一个整型。所以当我们执行 where c=” 2012-12-14 00:42:45”的时候,需要将其转换为整型。这就涉及到转换规则。也就是说,对于相同的时间戳,在不同的时区显示的结果是不一样的。反过来也一样,相同的字符串,在不同的时区解释下,会得到不同的时间戳。

我们来看一下整个mysqldump的结果。在文件头部,可以看到

/*!40103 SET TIME_ZONE='+00:00' */; 字样,说明mysqldump在默认情况下,是按’+00:00’(中时区).

而mysql客户端的默认值呢:

mysql> select @@time_zone;

+-------------+

| @@time_zone |

+-------------+

| SYSTEM      |

+-------------+

 

这个SYSTEM表示MySQL取操作系统的默认时区,因此是东8区。如果我们设置为与mysqldump相同时区,

mysql> set time_zone='+00:00';  

Query OK, 0 rows affected (0.00 sec)

 

mysql> select * from tb;

+---------------------+

| t                   |

+---------------------+

| 2012-12-13 16:42:45 |

+---------------------+

1 row in set (0.00 sec)

就跟我们上面看到的全表导出的结果一样了。

也就是说,这个问题是因为mysqldump强行设置了时区为中时区造成的。

 

解决1

从mysqldump的代码中我们看到,可以用 --tz-utc=0 参数去掉前面的设置时区的动作。这样用的也是默认时区。

mysqldump  --tz-utc=0 -Srun/mysql.sock -uroot   test tb   --where='c="2012-12-14 00:42:45"'  |grep INSERT

INSERT INTO `tb` VALUES ('2012-12-14 00:42:45');

 

可以看到,这个貌似就是我们要的结果,导出的结果也很合理。

 

进一步

如果这个这么好,为什么mysqldump的开发者不把—tz-utc=0作为默认行为呢?也就是说哦这样做有什么风险?

实际上是因为要防止跨时区导数据。假设你把中国一个机器上的数据导入到美国的一个mysqld(想起@plinux 说的b2b就有这种情况),若不显式地设置一个时区,在导入时就会出错了。因为都用系统默认的时区,相同的字符串值会得到不同的时间戳。如我们前面说的, 时间戳是以整型方式存储的。

 

解决2

所以上面的--tz-utc=0存在风险。当然如果你确定源和目标系统时区没变,是ok的。我们讨论看看有没有更保险的方法。

既然是时间戳是保险的,其实可以考虑,用时间戳来做where条件。

mysql> select unix_timestamp(c) from tb;

+-------------------+

| unix_timestamp(c) |

+-------------------+

|        1355416965 |

+-------------------+

 

按照表里的这个值,我们的dump命令改成

mysqldump   -Srun/mysql.sock -uroot   test tb   --where=' unix_timestamp(c)=1355416965' | grep INSERT

INSERT INTO `tb` VALUES ('2012-12-13 16:42:45');

这次对了,而且与是否使用 --tz-utc=0  无关,都能得到结果,区别只是显示问题。

 

不过对MySQL比较熟悉的同学就知道,这个写法还是存在一个问题:用不上索引,因为我们在字段上做了unix_timestamp这个操作。有时候我们在这种表上为了导出方便有一个索引专门建在timestamp字段上。

 

因此想到用逆函数

mysqldump   -Srun/mysql.sock -uroot   test tb   --where='c= from_unixtime(1355416965)'  | grep INSERT         

INSERT INTO `tb` VALUES ('2012-12-13 16:42:45');

 

RV1126B芯片实战:如何用这款视觉处理器SoC打造你的第一个AI摄像头项目 本文详细介绍了如何利用瑞芯微RV1126B视觉处理器SoC从零构建AI摄像头项目。涵盖硬件选型、开发环境搭建、ISP配置、AI模型部署及系统集成等关键步骤,帮助开发者高效实现边缘计算方案,特别适合智能安防和工业检测应用。 阅读详情

相关推荐

Jetson Orin NX上PyTorch环境搭建与性能优化指南

本文详细指导如何在Jetson Orin NX上搭建高效的PyTorch开发环境。内容涵盖CUDA与cuDNN的“隐藏”配置、Miniconda虚拟环境管理、PyTorch for Jetson的正确安装与验证,并提供了电源模式设置、TensorRT加速、混合精度等关键性能优化实战技巧,帮助开发者充分释放边缘AI设备的算力。

weixin_29090089的博客 338

mysqldump导出注意timestamp类型

时区mysql> show global variables like '%zone%'; +------------------+--------+ | Variable_name | Value | +------------------+--------+ | system_time_zone | CST | | time_zone | SYSTEM | +----

FaN() 2377

内存|内存的概念、内存的作用、内存的物理结构及内存使用

内存是硬件,是用于存放数据的硬件。程序执行前需要先放到内存中才能被CPU处理。内存是与CPU沟通的桥梁,计算机中所有程序的运行都要依靠内存,内存对计算机的影响非常大。本文简单介绍了内存的概念、作用、物理结构以及使用,内存远不止如此,后续文章会逐步深入讲解。

qq_59938293的博客 2万+

【bug】sqlite plus Error parsing time stamp

使用datetime类型是会报错Error parsing time stamp。

掘金者说 2389

SIwave:在 SIwave 中释放计算频率扫描的强大功能

AEDT 的电路工具允许注入正确的电压和电流。要使用电路工具,SIwave 必须首先使用 PI 求解器求解结构的 S 参数。

jkh920184196的博客 1476

单片机NTC热敏电阻测温:六种实用电路方案与选型指南

本文详细介绍了单片机系统中NTC热敏电阻测温的六种实用电路方案,包括分压法、恒流源法、RC充放电法、电桥法、频率法及集成专用IC方案,并提供了关键的硬件选型指南和软件处理技巧,帮助工程师实现高精度、低成本的温度测量。

herb5的博客 821

使用mysqldump 导出 含有timestamp类型的表,应注意--skip-tz-utc

Mysql,原和目标机器均为东八区时区 准备将符合下面条件的数据从一个服务器导到另一个服务器中: create_time 其中 create_time 为timestamp ,使用下面的语句导出 mysqldump -uroot -h127.0.0.1 -P3307 -p dbname tablename --where="create_time tabname.sql

流子的专栏 3124

通达信-申万宏源金融终端本地数据转sqlite3,2、解析申万宏源C:/zd_swhy_gm/vipdoc/sh/lday的sh600000股票数据

为量化做准备,通达信-申万宏源金融终端本地数据转sqlite3,解析申万宏源C:/zd_swhy_gm/vipdoc/sh/lday的sh600000股票数据

wuyaqi的博客 511

mysql之TIMESTAMP(时间戳)用法详解

转载:https://www.jb51.net/article/51794.htm

sky198989的博客 1604

【AWS】创建aws云服务器EC2实例

本文介绍了如何创建aws的EC2云服务器,并介绍了如何使用Xshell远程连接上云服务器

Marcos921的博客 2502

QGIS|如何将WGS84转换为CGCS 2000坐标系?

QGIS 3中如何将WGS84转换为国家2000大地坐标系? 今天来回答一位朋友在后台留言提出的问题:怎么将WGS84坐标转换为国家2000大地坐标系。 01工程坐标系 从地图窗口右下角的状态栏可以看到当前地图窗口的坐标系,即工程坐标系(Project CRS)。当前地图可以由多个图层组成,各种来源数据的坐标参照系(Layer CRS)并不一定相同,QGIS在绘制图层之前将根据工程坐标系进行动态坐标转换,然后显示在地图画布中。 因此,在处理空间数据的过程中,一定要特别注意...

QGISClass的博客 1万+

mysql的时间戳_MySQL时间戳(Timestamp)函数

1. MySQL 获得当前时间戳函数:current_timestamp, current_timestamp()mysql> select current_timestamp, current_timestamp();+———————+———————+| current_timestamp | current_timestamp() |+———————+———————+| 2008-08-...

weixin_42297904的博客 1万+

基于YOLOv8和时序模型的异常动作检测系统

异常动作检测是计算机视觉领域的重要应用,广泛应用于智能监控、安防系统、老人看护等场景。本项目结合YOLOv8目标检测和LSTM时序模型,实现对打架、摔倒、奔跑等异常动作的实时检测,并提供了完整的Web界面。多技术融合: 结合YOLOv8目标检测和LSTM时序建模实时检测: 支持实时视频流处理和文件分析用户友好: 提供完整的Web界面可扩展性: 模块化设计便于功能扩展高性能: 包含多种优化策略。

YOLO 764

MySQL关于timestamp和mysqldump的一个“bug”【转】

说是MySQL关于timestamp和mysqldump的一个“bug”,其实是MySQLdump 的时候 对timestamp 类型字段的一个转换问题,一直都没注意。看到这篇文章就知道遇到问题如何处理了。来自:http://dinglin.iteye.com/blog/1747685 复现 来源于一个同事在做数据转储碰到的的问题,简化如下: 1、建表 drop table if exis...

weixin_30846599的博客 104

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

MySQL

MySQL 是一个开源的关系型数据库管理系统(RDBMS),通常与 PHP、Java、Python 等语言搭配使用。网站后台数据存储日志系统电商库存管理用户信息管理系统统计报表系统MySQL 以InnoDB作为默认存储引擎,支持事务、行级锁、外键,是可靠性较高的数据库解决方案。

weixin_48447517的博客 413

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

mysql还原备份提示主键冲突_innodb_index_stats导入备份数据时报错表主键冲突的解决方法...

故障描述percona5.6,mysqldump全备份,导入备份数据时报错Duplicate entry 'hoc_log99-item_log_27-PRIMARY-n_diff_pfx01' for key 'PRIMARY'故障原因查看了下这个主键应该是MySQL系统库下的系统表innodb_index_statsmysql> show create table innodb_inde...

weixin_42539414的博客 505

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Mysql常用备份恢复方法

Mysql常用备份恢复方法

limintjhn8820的博客 378

mysql intt默认值_MySQL如何处理隐式默认值

有同学说遇到了主从不一致的问题。大概情况是,从库是用mysqldump导出导入数据的方式创建的。创建成功后,在用mysqldump验证主从的表结构是否一致的时候,发现有些表定义不一致:从他的比较结果可以看到,在从库端,有三个列的定义中被加入了“default null”。怀疑环境被人人为修改过,但是最终确认环境没有被动过。然后又做了一边测试,使用mysqldump导出数据,使用source将数据导...

weixin_39608478的博客 521

Ubuntu 14.04 MySQL数据库迁移实战:数据、权限、配置一致性保障

MySQL数据库迁移不是简单的文件拷贝,而是涵盖数据、用户权限、字符集、自增主键、配置参数与服务行为的全栈一致性重建。其核心原理在于保障源库与目标库在逻辑结构、存储引擎(如InnoDB)、SQL模式及运行时状态上的数字孪生。技术价值体现在避免锁表中断、emoji乱码、权限失效、主键冲突等生产事故;典型应用场景包括老旧系统升级(如Ubuntu 14.04→新OS)、云迁移、硬件替换及高可用架构重构。本文聚焦MySQL 5.5环境下的迁移实践,深度解析mysqldump逻辑导出与rsync物理拷贝双路径选型依据

weixin_30514745的博客 298

MySQL手册版本 5.0.20-MySQL同步(五)

<!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--><script type="text/javascript"

zgqtxwd的专栏 434

mysql 导入主键冲突_innodb_index_stats导入备份数据时报错表主键冲突的解决方法

故障描述percona5.6,mysqldump全备份,导入备份数据时报错Duplicate entry 'hoc_log99-item_log_27-PRIMARY-n_diff_pfx01' for key 'PRIMARY'故障原因查看了下这个主键应该是MySQL系统库下的系统表innodb_index_statsmysql> show create table innodb_inde...

weixin_32589877的博客 609

Ubuntu 18.04 MySQL 5.7 生产级部署指南

MySQL 是最主流的关系型数据库之一,其稳定安装与安全配置是 Web 应用、教育系统(如学生课程成绩管理)及中小型企业运维的基础能力。在 Ubuntu 系统中,MySQL 的部署远不止 apt install 命令执行——它涉及 systemd 服务管理、AppArmor 权限控制、字符集与 sql_mode 校准、ulimit 资源限制、时区同步及 ARM/x86 架构适配等底层原理。尤其在已停止维护的 Ubuntu 18.04 上,官方源 MySQL 5.7 的版本锁定、安全补丁集成与服务单元兼容性,

weixin_30247307的博客 406

MySQL知识点总结

一. 通用模块 1. MySQL体系结构 连接器:管理连接,权限验证(连接分为长连接和短连接) 解析器:词法分析,语法分析 查询缓存:解析完后若命中则直接返回结果(由于对一个表的更新,这个表上所有的查询缓存都会被清空,导致命中率低,MySQL 8.0 后废除) 优化器:执行计划生成,索引选择 存储引擎:真正负责数据的存取(底层物理结构),是基于表而不是基于库 2. ¥MyISAM和InnoDB存储引擎 是否支持行级锁 : MyISAM 只有表级锁(table-level locking),而InnoD

wanger61的博客 1144

MySQL安装与配置全指南:从入门到实践

关系型数据库是数据存储和管理的核心技术,MySQL作为最流行的开源关系型数据库之一,广泛应用于Web开发、企业系统等领域。其核心原理基于SQL标准,通过表结构存储数据并支持ACID事务特性。在技术价值方面,MySQL提供了高性能、高可靠的数据服务,支持主从复制、分区表等高级功能。实际应用场景包括电商平台用户数据管理、物联网设备数据存储等。本文以MySQL 8.0为例,详细讲解Windows和Linux平台的安装步骤,涵盖版本选择、环境配置、性能优化等关键环节,特别针对innodb_buffer_pool_s

weixin_34323858的博客 368

Ubuntu 18.04下PHP+MySQL BLOB存图实战指南

BLOB 是 MySQL 中用于存储二进制大对象的基础数据类型,其原理依赖于 InnoDB 的 off-page 存储机制与服务端/客户端包大小协同控制。技术价值在于实现文件与元数据的强一致性管理,规避路径丢失、事务断裂等风险;典型应用场景包括身份认证图像、医疗扫描件、金融票据等高敏感小尺寸(≤200KB)原始素材的可靠持久化。然而实际落地受制于 max_allowed_packet、PHP memory_limit、BLOB 类型选型及 ext4 IO 特性等多重约束。本文聚焦 Ubuntu 18.04

weixin_34293246的博客 450
上一篇: 关于一次导入数据提示的MySQL server has gone away
下一篇: 与MySQL的注释、Query_cache有关的一个bug
iteye_621
博客等级 码龄8年 12粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值