日期類型是數據庫中比較常用的一種數據類型,業務系統在操作該數據類型字段時,通常情況下都會賦值正常的日期格式數據或NULL值,這樣才符合正常的業務邏輯。而MySQL在處理日期類型字段時相對比較靈活,允許某種條件下日期字段存在0值現象,但這在正常的業務邏輯上是非法的。今天所分享的案例就是這種情況,生產MySQL5.7數據庫中的一張表,業務系統對該表的日期字段賦值",但MySQL數據庫中存儲的卻是0值。
查看sql_mode參數
看到上述數據第一反應是數據庫參數sql_mode被修改了,查看生產庫該參數具體值
STRICT_TRANS_TABLES:嚴格模式,表示一個值不能被插入一個事務表時,該sql被終止。
NO_ZERO_IN_DATE: 在嚴格模式下,不允許月、日出現0值,如 2010-00-01 or 2010-01-00。
NO_ZERO_DATE: 在嚴格模式下,不允許 0000-00-00 插入日期字段。
生產庫sql_mode參數并沒被修改,STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE同時啟用,是不允許0值出現在日期字段中的。
查看應用連接參數
既然生產sql_mode參數未被修改,那是否存在業務系統在連接數據庫時在會話級別修改了該參數的值?為了驗證這一猜想,打開MySQL數據庫的generallog,收集5分鐘的全量sql信息并分析:
ID為25766425的會話,從最初的連接建立到發出第一個select語句間并沒有對sql_mode參數的任何修改,可見業務系統應該沒在會話級修改sql_mode參數。
分析binlog
接下來分析下binlog,查看哪條語句引起的該現象:
分析后發現,是一條插入相應日期字段為’’值的insertignore語句引起的。
為驗證業務系統在沒修改會話級別sql_mode值的前提下,僅發出上述insertignore語句便引起了該現象,做了以下實驗:
創建一張測試表
測試insert ignore語句
測試確實產生了日期字段為0的現象,證明業務系統沒修改會話級別的sql_mode值;但卻出現了“日期字段bt被截取”的告警信息,說明MySQL內部做了操作。
測試insert語句
insert into語句卻出錯,難道這兩個語句在Mysql內部的處理機制不一樣嗎?如果插入的日期字段為NULL呢?
插入的日期字段為NULL
利用insertinto、insertignore into向日期字段插入NULL值時,都沒報錯且都是正常的日期字段合理取值。
官方文檔說明,在嚴格模式下,啟用NO_ZERO_DATE或NO_ZERO_IN_DATE,insertignore、updateignore語句是允許插入0值到日期字段并產生一個告警。
insertignore并沒有被NO_ZERO_DATE或NO_ZERO_IN_DATE模式影響,MySQL把插入日期字段的值"轉換為0值,二者結合產生了上述現象。因此建議在做MySQL數據庫操作時,盡量避免insertignore語句的使用,在向字段插入空值時都使用NULL而非"。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/130207.html
摘要:與大數據體系交互上報運行統計數據自帶了運行結果的統計數據,我們希望把這些統計數據上報到元數據系統,作為的過程元數據存儲下來。基于我們的開發策略,不要把有贊元數據系統的嵌入源碼,而是在之外獲取,截取出打印的統計信息再上報。一、需求 有贊大數據技術應用的早期,我們使用 Sqoop 作為數據同步工具,滿足了 MySQL 與 Hive 之間數據同步的日常開發需求。 隨著公司業務發展,數據同步的場景越...
摘要:通過團隊的全力全策,美團外賣的平均率從千分之三降到了萬分之二,最優值萬一左右率統計方式次數。美團外賣自年創建以來,業務就以指數級的速度發展。目前美團外賣日完成訂單量已突破萬,成為美團點評最重要的業務之一。 面試中常常問到的是Android的性能優化以及Crash處理。 今天我們來學習一下啊美團App的Crash處理。更多參考《Android性能優化:手把手帶你全面實現內存優化》 原為地...
閱讀 1346·2023-01-11 13:20
閱讀 1684·2023-01-11 13:20
閱讀 1132·2023-01-11 13:20
閱讀 1858·2023-01-11 13:20
閱讀 4099·2023-01-11 13:20
閱讀 2704·2023-01-11 13:20
閱讀 1385·2023-01-11 13:20
閱讀 3594·2023-01-11 13:20