日期时间值如何存储在 mysql 中?

Man*_*hit 6 java mysql timezone datetime date

我是数据库世界的新手。我正在从java程序发送一个日期时间值,例如'2016-04-27 09:00:00',以便将其保存到mysql数据库中。我的问题是如何将此值保存到 mysql db 表中的日期时间类型的字段中。我的意思是,它是否会像我传递的那样存储为字符串,或者 mysql 会解析字符串,并从中构造 UTC 时间戳并将该数字存储到 db 中。此外,无论 mysql 服务器和 java 服务器的时区设置如何,这个存储的值是否会从 java 程序中检索到?

很抱歉提出这样一个愚蠢的问题,但是在互联网上搜索时,这让我很受伤,并且没有得到简单且不那么令人困惑的答案。

sha*_*ihe 10

10.9 日期和时间数据类型表示

非小数部分的 DATETIME 编码:

 1 bit  sign           (1= non-negative, 0= negative)
17 bits year*13+month  (year 0-9999, month 0-12)
 5 bits day            (0-31)
 5 bits hour           (0-23)
 6 bits minute         (0-59)
 6 bits second         (0-59)
---------------------------
40 bits = 5 bytes
Run Code Online (Sandbox Code Playgroud)


Dre*_*rew 5

mysql 5.6.4 及之后的日期时间数据类型按照手册页日期和时间数据类型表示中的描述进行保存。简而言之,它是一种包含小数秒的 5 字节格式,并且与时区信息分离。

测试台

create table dtTest
(
    id int auto_increment primary key,
    dt datetime not null
);

insert dtTest (dt) values ('2016-04-27 09:00:00');
Run Code Online (Sandbox Code Playgroud)

如果需要确认这一点,可以跳转到保存文件的十六进制编辑器并验证该日期时间的大端格式。

show variables like '%datadir%';
C:\ProgramData\MySQL\MySQL Server 5.6\Data\
Run Code Online (Sandbox Code Playgroud)

遍历文件夹和数据库表 (dtTest.ibd)

时区有系统和会话变量:

show variables like '%system_time_zone%';
Eastern Daylight Time

show variables like '%time_zone%';
SYSTEM
Run Code Online (Sandbox Code Playgroud)

让我明确一点,我完全不知道这些的重要性。希望同行可以增加清晰度。

SELECT @@global.time_zone, @@session.time_zone;
SYSTEM    SYSTEM
Run Code Online (Sandbox Code Playgroud)

测试重置为不同的东西:

SET SESSION time_zone = '+10:00';
select * from dtTest;
Run Code Online (Sandbox Code Playgroud)

请注意,上述设置更改不会影响数据的输出。它仍然是原始的,与时区无关。

SET SESSION time_zone = 'America/Chicago';
Run Code Online (Sandbox Code Playgroud)

对于上述工作,请参阅:

http://dev.mysql.com/doc/refman/5.6/en/mysql-tzinfo-to-sql.html

否则,如果没有加载该时区支持,则需要执行以下操作:

SET SESSION time_zone = '+10:00';

SELECT @@global.time_zone, @@session.time_zone;
SYSTEM      +10:00
Run Code Online (Sandbox Code Playgroud)

将会话设置回我的默认值:

SET SESSION time_zone = 'SYSTEM';
Run Code Online (Sandbox Code Playgroud)
SELECT COUNT(*) FROM mysql.time_zone_name;
Run Code Online (Sandbox Code Playgroud)

我的计数是 0,因为我还没有加载时区支持表

SELECT CONVERT_TZ('2007-03-11 3:00:00','US/Eastern','US/Central');
-- so this is NULL for me. No support table loaded yet on my system.

SELECT CONVERT_TZ('2007-03-11 3:00:00','-4:00','-7:00');
2007-03-11 00:00:00 -- means that 3am NYC is midnight in San Fran
Run Code Online (Sandbox Code Playgroud)

所以上面不是NULL(读取UTC时间偏移不太友好。硬编码)。

SELECT id, CONVERT_TZ(dt,'-4:00','-7:00') from dtTest;  -- dt was my column name
1   2016-04-27 06:00:00
Run Code Online (Sandbox Code Playgroud)

上面的select语句取db中的9am值,可以将其从NYC时间转换为San Fran时间。

那是我给你最好的。希望有人可以填写时区支持缺失的细节。