MySQL 中的日期 encoded/stored 怎么样?

How is date encoded/stored in MySQL?

我必须从我的 C++ 应用程序的数据库中获取原始字节来解析日期。我发现 MySQL 中的日期是 4 个字节,最后两个分别是月和日。但是前两个字节奇怪地编码了年份,所以如果日期是2002-08-30,内容将是210、15、8、31。如果日期是1996-12-22,日期将被存储为204 , 15, 12, 22。 显然,第一个字节不能大于 255,所以我检查了 2047 年——它是 255、15 和 2048——它是 128、16。

一开始我以为关键是二元运算,但是我不太明白其中的逻辑:

2047: 0111 1111 1111
255:  0000 1111 1111
15:   0000 0000 1111

2048: 1000 0000 0000
128:  0000 1000 0000
16:   0000 0001 0000

有什么想法吗?

根据您提供的内容,似乎是N1 - 128 + N2 * 128

看来编码的逻辑是擦除第一个数字的最高有效位,然后从这个擦除的位写入第二个数字,如下所示:

2002 from 210 and 15:

1101 0010 -> _101 0010;
0000 1111 + _101 0010 -> 0111 1101 0010

2048 from 128 and 16:

1000 0000 -> _000 0000
0001 0000 + _000 0000 -> 1000 0000 0000

哪个版本???

DATETIME曾经以压缩十进制(8 字节)编码。但是,添加小数秒后,格式更改为

  • 长度指示(1字节)
  • INT UNSIGNED 对于 seconds-since-1970(4 字节)
  • 小数秒(0-3 字节)

DATEMEDIUMINT UNSIGNED(3 个字节)一样存储为自 0000-00-00(或类似日期)以来的天数。

您是如何获得“原始字节”的?没有让你这样做的功能。 Select HEX(some-date) 首先转换为字符串(如“2022-03-22”),然后取其十六进制。那给你 323032322D30332D3232.