Year 2038 problem

news2024/11/15 9:10:09
alt

前情回顾


已经知道,对于int了tinyint了这些MySql类型,后面那个4或者11没啥实际意义,只是说(当位数不足时)前面填充多少个0,然后使之变为4位或者11位,对这个类型的字段实际能存的长度没啥影响.

即占据1个Byte的tinyint类型,最多就能表征256个不同值. 可以表征无符号的连续数字0-255,或者有符号的数字-128到127.

char类型括号里的数字和tinyint/int差不多;

而varchar不同,括号里的这个数字确实有实际意义,可以指定其最大能存多少,其所谓"可变",也就是在这里.即varchar这个类型能存的最大长度,根据后面括号里的这个数值而变.

且自MySql 5.0后,这个数字指"字符",而不再是"字节",即对一个varchar(6),存"张三李四王五"没问题,但"1234567"或"abcdefg",则会溢出.


timestamp类型 占4Byte即32个Bit,也即最多能表征2的32次方个不同值。如果考虑正负,可存纳从0到2的32次方-1的数;若考虑符号,则可容纳-2的31次方到2的31次方-1多的数。…也即如果存时间戳类型,最多在从格林尼治时间1970-01-01 00:00:00开始,过后2的32次方-1秒后,将会出现溢出问题。

但问题是,实际是过2的31次方-1秒,(即2147483647秒,巧合的是,这个数竟然是个梅森素数!)也就是格林尼治时间2038-01-19 03:14:07,就会因达到边界而出现问题。

那这里为何要用有符号的整型而白白浪费一个比特位?丝毫没有必要。而不这样做的好处却很显然,可以表示2的32次方-1秒,即4294967295,这样可以直接使可用时间到格林尼治时间2106-06-07 14:28:15。



孜孜以求


为这问题可真是上穷碧落下尘埃,没写过C++的我,甚至硬着头皮看了总共有2.2GB的MySql源码[1]……数据库时间戳字段其实会读取系统时间(如根据当前时间戳更新功能),这也就牵扯到了unix早期开发时,K&R两位天神的设计。

alt

几经寻索,我在这里[2]找到了与我相同的疑问:

alt

一种说法是,当时还没有无符号的整数这种类型(uint),也没有考虑到脱胎于贝尔实验室,Ken用来打游戏的unix,能够存活那么久,并作为信息时代最最重要基础设施,深刻改变了整个世界的面貌----失败的MULTICS启发了Ken和Dmr,于是有了Unix(和C语言),又在逾20年后,使芬兰人Linus一举成名,取代RMS,成为geek新一代精神领袖。今天,全世界90%以上的服务,包括MacOS,iOS,Android,以及几乎所有App和web网站的服务端代码,和unix/linux有最直接联系。

alt

实际上,在这个一日千里的时代和行业,人类并不会使『Year 2038 Problem』有机会真实发生,但这个探索的过程和过程中形成的一套方法论,却是特别具有意义。


附录小记


alt

另:Dmr于2011年10月,在西海岸硅谷叱咤风云的乔布斯去世后不久,被人发现默默死于东海岸寓所中,对这位Unix和C语言之父,图灵奖得主,祭奠者屈指可数。

alt

另一位Unix之父和图灵奖得主Ken(一种说法是Unix主要是Ken开发,但Dmr做了大量优秀设计,因而业界里奇前面,学界则恰好相反),同时亦是B语言之父,utf-8设计者。后来。他加入Google,和另外几位同僚一道(包括当年贝尔实验室的小弟Rob Pike),设计了一种叫做Golang的全新语言。

1999年肯·汤普逊(左)和丹尼斯·里奇因开发C语言和 Unix 操作系统一起获得了美国国家技术奖。



拓展:

alt

『梅森素数是由梅森数而来。 所谓梅森数,是指形如2的p次方-1的一类数,其中指数p是素数,常记为Mp 。如果梅森数是素数,就称为梅森素数。

用因式分解法可以证明,若2n-1是素数,则指数n也是素数;反之,当n是素数时,2n-1(即Mp)却未必是素数。前几个较小的梅森数大都是素数,然而梅森数越大,梅森素数也就越难出现。 目前仅发现51个梅森素数,最大的是M82589933(即2的82589933次方减1),有24862048位数。

真真是15年前便曾听过,但也仅限于此』




时间函数


在MySql中:

alt

# 获取当前时间戳

select UNIX_TIMESTAMP()
  • 1575379809

# 获取当前时间

select now()
  • 2019-12-03 21:31:32

# 2147483647时间戳(2的31次方-1)对应的当地时间

select FROM_UNIXTIME(2147483647,"%Y-%m-%d %H:%i:%S")
  • 2038-01-19 11:14:07

# 从格林尼治时间1970-01-01 00:00:00 过后9999999999秒后对应的当地时间(越界..)

select FROM_UNIXTIME(9999999999)
  • Null

# 1938-01-20 00:00:00 对应的"时间戳"(并不是负数)

select UNIX_TIMESTAMP("1938-01-20 00:00:00")
  • 0

参考资料

[1]

MySql源码: https://github.com/mysql/mysql-server

[2]

这里: https://unix.stackexchange.com/questions/25361/why-does-unix-store-timestamps-in-a-signed-integer

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1013078.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在工作流引擎设计领域,是否自动计算未来的处理人的设计模式有哪些?

概述 流程的第一个节点发送下去的时候,就要把以后所有节点的处理人计算出来,能清楚的知道每个节点都是那些人处理. 以驰骋bpm为例来说明这个设计 计算未来处理人包括抄送节点、与待办节点. 默认的模式为:每个节点发送的时候即使计算,就是不计算未来处理…

Linux 软件包管理器-yum使用

文章目录 前言一、yum使用1、什么是软件包2、yum源3、yum list 指令4、yum install 指令5、yum remove指令 二、git的使用1、gitee中仓库的创建2、仓库的克隆3、提交代码到远程仓库4、提交时可能遇到的问题5、.gitignore文件6、删除文件 前言 一、yum使用 1、什么是软件包 在…

发过的朋友圈怎么再快速发一次?

发过的朋友圈怎么再快速发一次? 大部分人第一反应都是去朋友圈 直接翻找,然后保存图片、文案 再重新编辑一次发布朋友圈 有没有快速一点的方法呢? 当然有啦! 推荐这款工具 就可以直接把发过的朋友圈再发一次 重发朋友圈 一键…

速卖通在西班牙市场大获成功,为何西班牙成为速卖通最受欢迎的国家之一?

速卖通(AliExpress)是阿里巴巴旗下的跨境电商平台,面向国际市场,被誉为"国际版淘宝"。 速卖通跨境电商平台最新动态,近日,Statista发布了速卖通全球国家市场渗透率排行榜,该排行榜基…

第十届国家网络安全宣传周今日在全国范围内启动

十届国家网络安宣传周回望 2023年国家网络安全宣传周于9月11日至17日在全国范围内统一开展。其中,开幕式等重要活动在福建省福州市举行。 第一届国家网络安全宣传周活动始于2014年,此后将每年9月的第三周定为活动举行日。网络安全宣传周至今已经走过10个…

Python量化金融风险分析:一文全面掌握VaR计算

金融市场是一个复杂且多变的生态圈,涉及从经济数据到政治动态的各种影响因素。无论你身处何种角色——小投资者、企业财务,还是大型金融机构的资产经理,你都必须面对各种不确定性,例如股价波动、利率变动或突发事件如政治危机和自…

R23C02版本正式发布 | 更智能、更稳定的菊风视频能力平台

近年来,音视频技术正在深入影响各行业服务效能提升,远程音视频服务也在逐渐发展成为对客的重要渠道。菊风作为以实时音视频技术为核心的创新服务商,一直坚持推进技术和产品的更新迭代,致力于孵化符合行业化发展需求的解决方案&…

电路中VCC VDD VSS VEE GND的含义

在电路中,芯片引脚经常会出现VCC,VDD,VSS,VEE和GND这些标示。 其中VCC一般表示通用芯片的电源引脚,比如一些模拟运放的正电源引脚,74系列数字芯片的电源引脚,VCC一般接相应的正电源电压。 VDD一…

HTTPS的传输过程

加密分为两种方式一种是对称加密,一种是非对称加密。 在对称加密算法中,加密和解密使用的密钥是相同的。也就是说,加密和解密使用的是同一个密钥。因此,对称加密算法要保证安全性的话,密钥要做好保密。只能让使用的人…

sudo+vim+g++/gcc+makefile

目录 一、信任表中加入指定的普通用户(使其能使用sudo) 二、vim的使用 (一)基本概念 1. 正常/普通/命令模式(Normal mode) 2. 插入模式(Insert mode) 3. 末行模式(last line mode) (二)vim正常模式…

Spring注解家族介绍:@RestController

前言: Spring Boot可以说是当前JAVA最为重要的一个框架,而Spring Boot的基石Spring中有着丰富的注解,因此我们会利用几篇文章来讲解我目前学到的各种注解,因此本类型文章的篇幅会比较短,主要着重于介绍各个注解。 目录…

Python-Jenkins 在 Jenkins 中的应用

Author:rab Python 版本:3.9 Jenkins 版本:2.409 官方文档:https://python-jenkins.readthedocs.io/en/latest/ 目录 前言一、案例1.1 管理 Jenkins Version1.2 管理 Jenkins Job1.2.1 普通创建 Job1.2.2 获取当前用户的所有 J…

C【程序环境和预处理】

1. 程序的翻译环境和执行环境 2. 详解编译链接 2.1 翻译环境 2.2 编译本身也分为几个阶段 sum.c int g_val 2016; void print(const char *str) {printf("%s\n", str); } test.c #include <stdio.h> int main() {extern void print(char *str);extern int…

气传导耳机品牌排行榜前十名,好用气传导耳机推荐

​随着人们对听力保护的重视&#xff0c;气传导耳机逐渐成为耳机市场的新宠。气传导耳机采用不入耳设计&#xff0c;让您你享受音乐的同时&#xff0c;也能保护你的听力&#xff0c;听感更自然真实通透。下面我将为大家推荐几款值得购买的气传导耳机&#xff0c;让你找到最适合…

网工内推 | 网络安全工程师,上市公司,13薪,食宿有补贴

01 苏州奖多多科技有限公司 招聘岗位&#xff1a;网络安全工程师&#xff08;安服渗透&#xff09; 职责描述&#xff1a; 1、负责客户网络安全攻击入侵事件溯源分析、处置等工作&#xff1b; 2、根据攻击告警/入侵事件&#xff0c;进行取证调查&#xff0c;攻击溯源反制&…

FPGA----VCU128的DDR4无法使用问题(全网唯一)

1、在Vivado 2019.1版本中使用DDR4的IP核会遇到如下图所示的错误&#xff0c;即便过了implementation生成了bit&#xff0c;DDR4也无法正常启动。 2、解决办法&#xff0c;上xilinx社区搜一下就知道了 AMD Customer Communityhttps://support.xilinx.com/s/article/69035?lan…

如何使用Semaphore和CompletableFuture搭配实现控制线程并发数量并等待所有线程执行完成之后在执行其它操作

代码示例&#xff1a; public static void main(String[] args) throws InterruptedException {ExecutorService executor Executors.newFixedThreadPool(4);Semaphore semaphore new Semaphore(2);try {CompletableFuture<String> futureA CompletableFuture.supplyA…

SpringMvc决战-【SpringMVC之自定义注解】

目录 一、前言 1.1.什么是注解 1.2.注解的用处 1.3.注解的原理 二.注解父类 1.注解包括那些 2.JDK基本注解 3. JDK元注解 4.自定义注解 5.如何使用自定义注解&#xff08;包括&#xff1a;注解标记【没有任何东西】&#xff0c;元数据注解&#xff09;&#xff1f; 三…

opencv dnn模块 示例(16) 目标检测 object_detection 之 yolov4

博客【opencv dnn模块 示例(3) 目标检测 object_detection (2) YOLO object detection】 测试了yolov3 及之前系列的模型&#xff0c;有在博客【opencv dnn模块 示例(15) opencv4.2版本dnn支持cuda加速&#xff08;vs2015异常解决&#xff09;】 说明了如何使用dnn模块进行cuda…

深入JVM:探索Java虚拟机

文章目录 1. JVM简介1.1 定义与核心作用1.2 JVM的跨平台特性 2. JVM内部结构深度探索2.1 类加载机制2.1.1 双亲委派模型2.1.2 OSGI框架2.1.3 类加载器分类 2.2 JVM运行时数据区2.2.1 程序计数器2.2.2 本地方法栈2.2.3 Java虚拟机栈 2.2.4 堆2.2.5 元数据区 2.3 JVM内存区域的性…