gpt4 book ai didi

mysql - 为什么MySQL的最大时间限制是838 :59:59?

转载 作者:可可西里 更新时间:2023-11-01 07:11:22 30 4
gpt4 key购买 nike

我自己也遇到了限制,但是尽管网上有很多讨论,但我从来没有看到解释 为什么 TIME 数据类型的上限和下限是什么。官方引用 http://dev.mysql.com/doc/refman/5.7/en/time.html

TIME values may range from '-838:59:59' to '838:59:59'. The hours part may be so large because the TIME type can be used not only to represent a time of day (which must be less than 24 hours), but also elapsed time or a time interval between two events (which may be much greater than 24 hours, or even negative).

但我想知道的不是为什么允许小时部分“如此之大”,而是为什么它被切断了。就天数而言,那么多小时似乎没有任何意义,或者如果我试图想象可以将多少秒存储为整数的可能截止值。那么为什么是范围?

最佳答案

TIME 值在 MySQL 中总是存储在 3 个字节上。但是格式在 version 5.6.4 上发生了变化.我怀疑这不是第一次发生变化。但另一个变化,如果有的话,也是很久以前发生的,而且没有公开的证据。 GitHub 上的 MySQL 源代码历史从 5.5 版开始(最早的提交是从 2008 年 5 月开始的),但我正在寻找的更改发生在 2001-2002 年左右(MySQL 4 于 2003 年推出)

如文档中所述,当前格式使用 6 位表示秒(可能的值:063),6 位表示分钟,10 位表示小时(可能的值:01023),1 位用于符号(添加已经提到的间隔的负值)和 1 位未使用并标记为“为将来的扩展保留” ".

它针对处理时间组件(小时、分钟、秒)进行了优化,并且不会浪费太多空间。使用这种格式可以存储 -1023:59:59+1023:59:59 之间的值。然而,MySQL 将小时数限制为 838,可能是为了与前一段时间编写的应用程序向后兼容,当时我认为这是限制。

直到 5.6.4 版本,TIME 值也存储在 3 个字节中,组件被打包为 days * 24 * 3600 + hours * 3600 + minutes * 60 + seconds。这种格式针对处理时间戳进行了优化(因为它实际上是一个时间戳)。使用这种格式可以存储大约 -2330+2330 小时范围内的值。虽然有这么大范围的可用值,MySQL 仍然将值限制在 -838+838 小时内。

bug #11655在 MySQL 4 上。可以使用嵌套的 SELECT 语句返回 -838..+838 范围之外的 TIME 值。这不是一项功能,而是一个错误,并且已修复。

将值限制在此范围内并主动更改任何产生 TIME 值的代码片段的唯一原因是向后兼容性。

我怀疑 MySQL 3 使用了不同的格式,由于数据的打包方式,将有效值限制在 -838..+838 小时范围内。


通过查看当前 MySQL's source code我发现了这个有趣的公式:

#define TIME_MAX_VALUE (TIME_MAX_HOUR*10000 + TIME_MAX_MINUTE*100 + TIME_MAX_SECOND)

让我们暂时忽略上面使用的名称的 MAX 部分,让我们只记住 TIME_MAX_MINUTETIME_MAX_SECOND0059 之间的数字。该公式只是将小时、分钟和秒连接成一个整数。例如,值 170:29:45 变为 1702945

这个公式提出了以下问题:假设 TIME 值存储在带符号的 3 个字节上,那么可以用这种方式表示的最大正值是多少?

我们正在寻找的值是 0x7FFFFF,十进制表示法是 8388607。由于最后四位数字 (8607) 应读作分钟 (86) 和秒 (07) 并且它们的最大有效值为 59,用上面的公式,带符号的3个字节可以存储的最大值是8385959。其中,TIME+838:59:59。哒哒!

你猜怎么着?上面列出的 C 代码片段是从这里提取的:

/* Limits for the TIME data type */
#define TIME_MAX_HOUR 838
#define TIME_MAX_MINUTE 59
#define TIME_MAX_SECOND 59
#define TIME_MAX_VALUE (TIME_MAX_HOUR*10000 + TIME_MAX_MINUTE*100 + TIME_MAX_SECOND)

我确信这就是 MySQL 3 用来在内部保存 TIME 值的方式。这种格式施加了范围的限制,对后续版本的向后兼容性要求将这种限制传播到了我们这个时代。

关于mysql - 为什么MySQL的最大时间限制是838 :59:59?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39259910/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com