<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          MySQL 8.0 timestamp引發(fā)的狗血劇情

          共 1719字,需瀏覽 4分鐘

           ·

          2022-01-09 11:14

          今天業(yè)務(wù)反饋了一個(gè)問題,modify_time字段不允許為null,而業(yè)務(wù)反饋這個(gè)字段是設(shè)置了默認(rèn)值的,具體的業(yè)務(wù)報(bào)錯(cuò)信息如下所示:

          259f876e480268f8dd7e12784b66ccc6.webp

          從報(bào)錯(cuò)信息看,可能是modify_time字段沒有設(shè)置默認(rèn)值或默認(rèn)值設(shè)置的不正確導(dǎo)致

          接下來查看一下表結(jié)構(gòu):

          CREATE TABLE `jj_xxxx` (....  `create_time` timestamp NOT NULL DEFAULT '1999-12-31 23:00:00' ,  `update_user` int DEFAULT NULL,  `modify_time` timestamp NOT NULL DEFAULT '1999-12-31 23:00:00', ....  PRIMARY KEY (`goods_id`)) ENGINE=InnoDB AUTO_INCREMENT=4893 DEFAULT CHARSET=utf8 COMMENT='xxxxx'

          從表結(jié)構(gòu)看,設(shè)置的默認(rèn)值好像也沒有啥問題,檢查一下sql_mode參數(shù)的設(shè)置,好像也沒有發(fā)現(xiàn)啥問題;

          業(yè)務(wù)人員反饋線上的表也是這樣的,但是線上是正常的,而目前要把這個(gè)業(yè)務(wù)遷移到其他的環(huán)境,從業(yè)務(wù)到數(shù)據(jù)庫是另外一套環(huán)境;

          忽然考慮到了數(shù)據(jù)庫版本的差異;遷移的新環(huán)境是MySQL 8.0版本,而線上環(huán)境是5.7版本,兩個(gè)版本中參數(shù)explicit_defaults_for_timestamp 設(shè)置的默認(rèn)值是不一樣的;

          關(guān)于MySQL 8.0版本時(shí)間類型詳細(xì)可參考:MySQL 8.0中DATE,DATETIME和 TIMESTAMP類型和5.7之間的差異

          原因:

          explicit_defaults_for_timestamp 系統(tǒng)變量決定MySQL服務(wù)端對timestamp列中的默認(rèn)值和NULL值的不同處理方法。

          此變量自MySQL 5.6.6 版本引入,分為全局級別和會話級別,可動態(tài)更新,默認(rèn)值為OFF。

          在8.0之中默認(rèn)值改為了on

          explicit_defaults_for_timestamp=OFF,表示使用默認(rèn)的timestamp默認(rèn)格式;timestamp類型的默認(rèn)格式是什么樣的呢?

          1、和其它字段類型不一樣,這個(gè)字段默認(rèn)為not null.而且不允許設(shè)置default null.

          2、第一列timestamp字段,如果不強(qiáng)制指定默認(rèn)值或on update屬性的話,就會默認(rèn)設(shè)為DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP。

          3、非第一列timestamp字段,如果不強(qiáng)制指定默認(rèn)值,DEFAULT ‘0000-00-00 00:00:00’

          4、往該列中插入null值,會自動轉(zhuǎn)化為默認(rèn)值;

          explicit_defaults_for_timestamp=ON,則關(guān)閉timestamp default的特性:

          1、如果沒有被顯示指定not null,則默認(rèn)為null;

          2、默認(rèn)值也會是null而非CURRENT_TIMESTAMP;

          3、如果指定了not null屬性,inset式不指定該字段的值,strict sql_mode下,會報(bào)錯(cuò)。非strict sql_mode下插入’0000-00-00 00:00:00’;

          需要仔細(xì)考慮下面的場景:

          1、timestamp not null default CURRENT_TIMESTAMP,當(dāng)explicit_defaults_for_timestamp由0轉(zhuǎn)為1時(shí)會帶來什么業(yè)務(wù)影響?

          這樣的轉(zhuǎn)化,如果該timestamp字段有默認(rèn)值,會造成原本insert 該timestamp字段value為null的語句會插入失敗,影響業(yè)務(wù);

          2、datetime default null 轉(zhuǎn)成 timestamp default CURRENT_TIMESTAMP,又會帶來什么業(yè)務(wù)影響呢?

          做這樣的字段轉(zhuǎn)化,會把原本該字段為null的值都轉(zhuǎn)化為CURRENT_TIMESTAMP,如果歷史數(shù)據(jù)多的化,這樣的轉(zhuǎn)化是非常耗資源的。同時(shí)還需考慮值的轉(zhuǎn)變對業(yè)務(wù)帶來的影響。

          瀏覽 65
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美九九九九 | 韩日三级片电影在线观看 | 黄色毛片A级 | 夜色在线看av | 亚洲无码在线99 |