我自己也遇到了限制,但是尽管网上有很多讨论,但我从来没有看到解释 为什么 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 位表示秒(可能的值:0 到 63),6 位表示分钟,10 位表示小时(可能的值:0 到 1023),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_MINUTE 和 TIME_MAX_SECOND 是 00 和 59 之间的数字。该公式只是将小时、分钟和秒连接成一个整数。例如,值 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/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查