成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL關于時間設置的注意事項

數據庫 MySQL
時間真的存在嗎?有觀點認為,時間只是人類構想出來的一種概念,是用來衡量事物變化的標準。對于數據庫來說,時間伴隨著數據并進。讓我們進入MySQL時間漩渦中看一看。

 [[396879]]

本文轉載自微信公眾號「數據和云」,作者數據和云。轉載本文請聯系數據和云公眾號。

時間真的存在嗎?有觀點認為,時間只是人類構想出來的一種概念,是用來衡量事物變化的標準。對于數據庫來說,時間伴隨著數據并進。讓我們進入MySQL時間漩渦中看一看。

1. 時間類型的字段

MySQL時間類型字段:

下面是容易忽略的內容:

  • TIMESTAMP保存數據方式:

MySQL將TIMESTAMP值從當前時區轉換為UTC進行存儲,并從UTC返回到當前時區進行檢索。(這不適用于其他類型,比如DATETIME。)默認情況下,每個連接的當前時區是服務器的時間。時區可以在每個連接的基礎上設置。只要時區設置保持不變,就會返回所存儲的相同值。如果存儲一個時間戳值,然后更改時區并檢索該值,則檢索到的值與存儲的值不同。出現這種情況是因為沒有在兩個方向上使用相同的時區進行轉換。當前時區可以作為time_zone系統變量的值。

  • TIMESTAMP和SQL_MODE組合

sql_mode也會影響timestamp值:

  1. mysql> CREATE TABLE ts ( 
  2.          id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY
  3.          col TIMESTAMP NOT NULL 
  4.      ) AUTO_INCREMENT = 1; 
  5.  
  6. mysql> SHOW VARIABLES LIKE  '%sql_mode%'
  7. +---------------+---------------------+ 
  8. | Variable_name | Value               | 
  9. +---------------+---------------------+ 
  10. | sql_mode      | STRICT_TRANS_TABLES | 
  11. +---------------+---------------------+ 
  12. mysql>  INSERT INTO ts (col) VALUES ('1969-01-01 01:01:10'); 
  13. ERROR 1292 (22007): Incorrect datetime value: '1969-01-01 01:01:10' for column 'col' at row 1 
  14.  
  15. mysql> SET sql_mode=""
  16. Query OK, 0 rows affected (0.00 sec) 
  17. mysql> SHOW VARIABLES LIKE  '%sql_mode%'
  18. +---------------+-------+ 
  19. | Variable_name | Value | 
  20. +---------------+-------+ 
  21. | sql_mode      |       | 
  22. +---------------+-------+ 
  23. mysql>  INSERT INTO ts (col) VALUES ('1969-01-01 01:01:10'),('2999-01-01 01:01:10'); 
  24. Query OK, 2 rows affected, 2 warnings (0.01 sec) 
  25. Records: 2  Duplicates: 0  Warnings: 2 
  26. mysql> show warnings; 
  27. +---------+------+----------------------------------------------+ 
  28. Level   | Code | Message                                      | 
  29. +---------+------+----------------------------------------------+ 
  30. | Warning | 1264 | Out of range value for column 'col' at row 1 | 
  31. | Warning | 1264 | Out of range value for column 'col' at row 2 | 
  32. +---------+------+----------------------------------------------+ 
  33.  
  34. mysql> SELECT * FROM TS; 
  35. +----+---------------------+ 
  36. | id | col                 | 
  37. +----+---------------------+ 
  38. |  1 | 0000-00-00 00:00:00 | 
  39. |  2 | 0000-00-00 00:00:00 | 
  40. +----+---------------------+ 
  41. rows in set (0.00 sec) 

通過控制sql_mode,超出timestamp限制值還是插入進去了,但采用的是0填空方式。

對于STRICT_TRANS_TABLES, MySQL將一個無效的值轉換為最接近的有效值,然后插入調整后的值。如果缺少一個值,MySQL將為列數據類型插入隱式的默認值。

2. explicit_defaults_for_timestamp時間處理機制

默認情況是啟用。

在MySQL 8.0.22中,如果試圖在聲明為TIMESTAMP NOT NULL的列中插入NULL,將會被拒絕,并產生錯誤。

1)explicit_defaults_for_timestamp被禁用時:

  • 沒有使用NULL屬性顯式聲明的時間戳列將自動使用NOT NULL屬性聲明。允許為這樣的列賦值為NULL,并將該列設置為當前時間戳。在MySQL 8.0.22中,如果試圖在聲明為TIMESTAMP NOT NULL的列中插入NULL,將會被拒絕,并產生錯誤。
  • 如果表中的第一列沒有使用NULL屬性或顯式的DEFAULT或ON UPDATE屬性進行聲明,則會自動使用默認的CURRENT_TIMESTAMP屬性和ON UPDATE CURRENT_TIMESTAMP屬性進行聲明。
  • TIMESTAMP 如果沒有顯式地使用NULL屬性或顯式默認屬性聲明,則自動聲明為默認的’0000-00-00 00:00:00’(“零”時間戳)。
  • 根據啟用的是strict SQL模式還是NO_ZERO_DATE SQL模式,默認值“0000-00-00 00:00:00”可能無效。

2)explicit_defaults_for_timestamp被啟用:

  • 不可能為TIMESTAMP指定NULL值來將其設置為當前時間戳。要指定當前時間戳,設置為CURRENT_TIMESTAMP或一個同義詞,比如NOW()。
  • 沒有使用not NULL屬性顯式聲明的TIMESTAMP列將自動使用NULL屬性聲明并允許空值。
  • 使用NOT NULL屬性聲明的時間戳列不允許空值。對于為這樣的列指定NULL的插入,如果啟用了strict SQL模式,那么單行插入會出現錯誤,或者禁用了strict SQL模式的多行插入會插入’0000-00-00 00:00:00’。在任何情況下,為列賦值為NULL都不會將其設置為當前時間戳。
  • 使用NOT NULL屬性顯式聲明且沒有顯式默認屬性的時間戳列被視為沒有默認值。對于未為此類列指定顯式值的插入行,結果取決于SQL模式。如果啟用了嚴格SQL模式,則會出現錯誤。如果沒有啟用嚴格的SQL模式,則使用默認隱式值’0000-00-00 00:00:00’聲明該列,并出現警告。
  • timestamp類型字段 不會自動使用默認的CURRENT_TIMESTAMP屬性或更新CURRENT_TIMESTAMP屬性聲明。這些屬性必須顯式指定。

測試:

  1. CREATE TABLE `test1`( 
  2. id bigint not null AUTO_INCREMENT COMMENT '主鍵ID'
  3. name varchar(20) COMMENT '主鍵ID'
  4. create_time TIMESTAMP  NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'cr time'
  5. PRIMARY KEY(id) 
  6. )ENGINE=InnoDB  AUTO_INCREMENT=1 ; 
  7. SHOW VARIABLES LIKE 'explicit_defaults_for_timestamp'
  8. SET  GLOBAL  explicit_defaults_for_timestamp=ON
  9. SET  GLOBAL  explicit_defaults_for_timestamp=OFF
  10. INSERT INTO test1(id,name,create_time) VALUES(1,'Kit',NULL); 

3. MySQL系統配置

系統相關事件參數包含3個:

  1. mysql>show global variables where Variable_name like '%time_zone%' or Variable_name like 'log_timestamp%'
  2. +------------------+--------+ 
  3. | Variable_name    | Value  | 
  4. +------------------+--------+ 
  5. | system_time_zone | CST    | 
  6. | time_zone        | SYSTEM | 
  7. | log_timestamps   | UTC    | 
  8. +------------------+--------+ 
  9. rows in set (0.00 sec) 

1)system time zone:

當服務器啟動時,它嘗試自動確定主機的時區,并使用它來設置system_time_zone系統變量。此后該值不會改變。

2)time_zone:

全time_zone表示服務器當前運行的時區。初始的time_zone值為“SYSTEM”,表示服務器時區與系統時區一致。

  • 如果設置為SYSTEM,如MySQL函數調用都會調用一個系統庫來確定當前的系統時區。這個調用可能被一個全局互斥鎖保護,從而導致爭用。CPU使用率高問題。
  • 設置會話時區會影響時區敏感的時間值的顯示和存儲。這包括NOW()或CURTIME()等函數顯示的值,以及存儲在時間戳列中的值和從時間戳列檢索到的值。時間戳列的值將從會話時區轉換為UTC用于存儲,從UTC轉換為會話時區用于檢索。
  • 會話時區設置不影響UTC_TIMESTAMP()等函數顯示的值,也不影響DATE、time或DATETIME列中的值。這些數據類型的值也不存儲在UTC;時區僅在從時間戳值轉換時適用它們。

備注:MySQL還提供時區導入到MySQL系統庫的方法。通過mysql_tzinfo_to_sql程序加載/usr/share/zoneinfom下的時區信息。

  1. mysql> SELECT COUNT(*) FROM mysql.time_zone_name; 
  2. +----------+ 
  3. COUNT(*) | 
  4. +----------+ 
  5. |        0 | 
  6. +----------+ 

##mysql_tzinfo_to_sql工具導入時區值。

  1. shell>mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql 
  2. mysql> SELECT COUNT(*) FROM mysql.time_zone_name; 
  3. +----------+ 
  4. COUNT(*) | 
  5. +----------+ 
  6. |     1780 | 
  7. +----------+ 

3)log_timestamps

  • 這個變量控制寫入錯誤日志的消息以及寫入文件的一般查詢日志和慢速查詢日志消息中的時間戳的時區。
  • 它不會影響一般查詢日志的時區和慢速查詢日志消息寫入表(mysql。general_log mysql.slow_log)。
  • 允許的log_timestamps值是UTC(默認值)和SYSTEM(本地系統時區)。

備注:UTC一般指協調世界時。協調世界時,又稱世界統一時間、世界標準時間、國際協調時間,就是UTC+8小時=中國時間。當然值需要跟系統記錄時間一致,才能更好地管理。

  1. #設置時區,更改為東八區 
  2. SET GLOBAL time_zone = '+8:00';   

建議:

  1. [mysqld] 
  2. log_timestamps=SYSTEM 
  3. default-time_zone                  = '+8:00' 
  1. mysql>show global variables where Variable_name like '%time_zone%' or Variable_name like 'log_timestamp%'
  2. +------------------+--------+ 
  3. | Variable_name    | Value  | 
  4. +------------------+--------+ 
  5. | log_timestamps   | SYSTEM | 
  6. | system_time_zone | CST    | 
  7. | time_zone        | +08:00 | 
  8. +------------------+--------+ 

總結

從時間類型、參數、系統時區了解到,MySQL里時間應該怎樣設置和使用,特別是無特殊要求,sql_mode不要輕易改動。

關于作者

崔虎龍,云和恩墨MySQL技術顧問,長期服務于金融、游戲、物流等行業的數據中心,設計數據存儲架構,并熟悉數據中心運營管理的流程及規范,自動化運維等。擅長MySQL、Redis、MongoDB數據庫高可用設計和運維故障處理、備份恢復、升級遷移、性能優化。自學通過了MySQL OCP 5.6和MySQL OCP 5.7認證。2年多開發經驗,10年數據庫運維工作經驗,其中專職做MySQL工作8年;曾經擔任過項目經理、數據庫經理、數據倉庫架構師、MySQL技術專家、DBA等職務;涉及行業:金融(銀行、理財)、物流、游戲、醫療、重工業等。

墨天輪原文鏈接:https://www.modb.pro/db/53474

 

責任編輯:武曉燕 來源: 數據和云
相關推薦

2011-07-21 14:28:17

MySQL事務事務保存點

2010-05-19 11:04:32

優化IIS

2010-11-26 16:27:01

MySQL使用變量

2011-05-26 11:22:04

SEO

2010-05-11 11:03:41

Mysql索引

2012-12-20 10:23:03

路由器COST

2010-04-19 10:32:46

無線網卡設置

2010-06-13 15:52:36

MySQL 復制設置

2009-09-24 14:53:43

打印服務器

2009-04-09 10:11:00

TCPIP設置

2010-04-15 11:32:54

Unix操作系統

2009-12-15 17:47:17

VSIP

2010-05-31 09:58:48

MySQL備份

2011-03-14 17:51:04

IBMDB2數據庫

2013-08-20 09:57:05

Hyper-V備份注意事項

2010-05-25 16:46:00

2011-08-04 15:00:46

AmoebaMySQL

2010-11-15 09:17:25

MySQL轉換Orac

2021-11-16 10:35:59

云計算云計算環境云應用

2023-01-14 09:49:11

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲欧洲精品在线 | 激情五月综合 | 久久精品久久综合 | 精品国产一区二区三区久久久蜜月 | 久久99精品国产 | 国产黄色电影 | 亚洲国产一区二区三区 | 国产成人精品免费视频 | 99自拍视频 | 粉嫩av| 正在播放一区二区 | 日韩在线视频播放 | 国产成人精品免高潮在线观看 | 欧美精品一二三区 | 99久久婷婷国产综合精品 | 91精品综合久久久久久五月天 | 在线一区二区三区 | 91在线中文字幕 | 夜夜爽99久久国产综合精品女不卡 | 日本特黄a级高清免费大片 成年人黄色小视频 | 欧美一区2区三区3区公司 | 中文字幕在线精品 | 欧美黄色片 | 日本一区二区三区视频在线 | 成年视频在线观看福利资源 | 99精品视频在线 | 天天爽夜夜操 | 国产视频一区二区三区四区五区 | 亚洲永久精品国产 | 亚洲一区二区三区高清 | 久久久久国产精品www | 最新超碰 | 国产日韩亚洲欧美 | 97精品超碰一区二区三区 | 狠狠的操 | 一区二区三区中文字幕 | 久久ww| 日韩欧美三区 | 精品久久久久久国产 | 国产成人免费视频网站高清观看视频 | 国产美女一区二区 |