问题说明
-
这两天一直在跟着 王大锤砸 大佬的文章进行学习。不得不说,大佬的文章写的是真的好,通俗易懂条理清晰,解答了我很多的疑惑,非常感谢!
-
昨天刚好学到了 “MySQL字段长度、取值范围、存储开销(5.6/5.7/8.x的主要类型,区分显示宽度/有无符号/定点浮点、不同时间类型” 这篇文章。其中,在关于
DATETIME 存储结构
的部分,有以下说法:
DATETIME类型从5.6.4开始,除了增加了小数秒支持,存储结构也发生了较大变化,存储开销从8字节降到了5字节
-
在上述文章中,已经详细给出了
DATETIME 按位存储
的具体组织形式了,快速传送门在此: DATETIME 存储结构。阅读本文之前,也强烈建议先去阅读下上述文章。 -
针对 具体实现,今天尝试看了一下 源码,算是弄明白如何 将存储空间从 8 字节 降低为 5 字节,但 表示的时间范围不变了。这种思路在嵌入式开发中应该很常见。下面一起来欣赏下源码吧。
源码复现
- 这里使用的是 mysql-server-8.0 的源码,源码就在 github 上:mysql 源码 github 地址
- 先来看下 MySQL 中的 时间类型 的 结构体 定义,位于
include/mysql_time.h
头文件中。
// 可以看到,年、月、日、时、分、秒 分别为 无符号 int 型
// secord_part 为 小数秒 部分,5.6.4 以上才支持
typedef struct MYSQL_TIME {
unsigned int year, month, day, hour, minute, second;
unsigned long second_part; /**< microseconds */
bool neg;
enum enum_mysql_timestamp_type time_type;
/// The time zone displacement, specified in seconds.
int time_zone_displacement;
} MYSQL_TIME;
- 上述结构体