2016-04-29 156 views
0

我是db world的新手。我從java程序發送日期時間值,例如'2016-04-27 09:00:00',以便將它保存到mysql數據庫中。我的問題是,如何將這個值保存到MySQL數據庫表中的datetime類型的字段中。我的意思是,它是否會以字符串形式存儲,因爲我已經通過了,否則mysql將解析該字符串,並構造UTC時間戳並將其存儲到數據庫中。而且,這個存儲值是否會像Java程序那樣被檢索,而不管mysql服務器和java服務器的時區設置是否不同?如何將datetime值存儲在mysql中?

對不起這樣一個愚蠢的問題,但它傷害了我很多,並沒有得到簡單和較少混淆的答案,同時搜索互聯網。

+0

此博客文章可能會回答:[日期是如何存儲的?](https://www.informit.com/library/content.aspx?b=STY_Sql_24hours&seqNum=93) – Phiter

+0

本機類型以原生格式存儲。 –

+1

你能解釋更多關於「它傷害了我很多,,,,」 – Drew

回答

2

MySQL 5.6.4及以後版本的datetime數據類型按手冊頁Date and Time Data Type Representation中的說明進行保存。簡而言之,它是一個包含小數秒的5字節格式,並與時區信息相分離。

測試表

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

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

如果一個確認這個需要,我們可以跳進保存文件的十六進制編輯器,並驗證日期時間的big-endian格式。

顯示類似'%datadir%'的變量;

C:\ProgramData\MySQL\MySQL Server 5.6\Data\ 

遍歷到文件夾和數據庫表(dtTest.ibd)

有對時區系統和會話變量:

顯示變量,如 '%system_time_zone%';

Eastern Daylight Time 

顯示類似'%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'); 

- 所以這是NULL我。我的系統上尚未加載支持表。

SELECT CONVERT_TZ('2007-03-11 3:00:00','-4:00','-7:00'); 

2007-03-11 00:00:00 - 意思是凌晨3點NYC是midnite聖弗蘭

所以上面沒有NULL(不太友好的閱讀UTC時間偏移硬編碼。 )。從dtTest中選擇id,CONVERT_TZ(dt,' - 4:00',' - 7:00'); - dt是我的專欄名稱

1 2016-04-27 06:00:00 

上述select語句採用db中的上午9點值,可以將其從紐約時間轉換爲聖弗蘭時間。

這是我爲你準備的最好的。希望有人可以填寫缺少的時區支持細節。

相關問題