datetime值如何存储在mysql中?

时间:2016-04-29 11:29:29

标签: java mysql date datetime timezone

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

对于这样一个愚蠢的问题感到抱歉,但在网上搜索时,这给我带来了很多伤害,并没有得到简单而不那么混乱的答案。

2 个答案:

答案 0 :(得分:2)

按照手册页Date and Time Data Type Representation中的说明保存mysql 5.6.4及之后的datetime数据类型。简而言之,它是一个5字节格式,包括小数秒,并且与时区信息分离。

测试表

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

insert dtTest (dt) values ('2016-04-27 09:00:00');

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

show variables like '%datadir%';
C:\ProgramData\MySQL\MySQL Server 5.6\Data\

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

时区有系统和会话变量:

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

show variables like '%time_zone%';
SYSTEM

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

SELECT @@global.time_zone, @@session.time_zone;
SYSTEM    SYSTEM

测试重置为不同的东西:

SET SESSION time_zone = '+10:00';
select * from dtTest;

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

SET SESSION time_zone = 'America/Chicago';

以上工作,请参阅:

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

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

SET SESSION time_zone = 'SYSTEM';
SELECT COUNT(*) FROM mysql.time_zone_name;

我的计数是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

所以上面不是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

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

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

答案 1 :(得分:1)

来自10.9 Date and Time Data Type Representation

非小数部分的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