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