亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

MySQL5.7中的sql_mode默認值帶來的坑及解決方法

2024-07-25 19:09:12
字體:
來源:轉載
供稿:網友

在正常項目開發過程中,如果MySQL版本從5.6升級到5.7版本。作為DBA在考慮數據庫版本升級帶來的影響時,一般會有幾個注意點:

sql_modeoptimizer_switch

本文主要內容是MySQL升級到5.7版本之后,由于默認的 sql_mode 值帶來的坑以及對應的解決方案。

案例一:ONLY_FULL_GROUP_BY

問題描述

MySQL版本從5.6升級至5.7之后,部分SQL執行報錯,報錯信息如下:

ERROR 1055 (42000): Expression #3 of XXXXXX list is not in GROUP BY clause and contains nonaggregated column ‘XXXXX.XXXXXX' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

這個問題原因在于從5.6升級至5.7版本后 sql_mode 默認值發生了改變,在5.7版本的 sql_mode 默認值中有意向 ONLY_FULL_GROUP_BY ,該選項的含義表示:對于使用 GROUP BY 進行查詢的SQL,不允許 SELECT 部分出現 GROUP BY 中未出現的字段,也就是 SELECT 查詢的字段必須是 GROUP BY 中出現的或者使用聚合函數的。

解決方案

方案一(不推薦):修改5.7版本 sql_mode 值,將 ONLY_FULL_GROUP_BY 去掉

ONLY_FULL_GROUP_BY 是加強SQL規范的,其目的是讓SQL查詢出來的結果更符合規范,更準確。

如果沒有 ONLY_FULL_GROUP_BY 規范限制,那么則能允許以下SQL的執行: SELECT a,b,c FROM t GROUP BY a 。SQL按照a字段值進行分組,當同一個a字段值對應多個b或者c值時,查詢結果中的b,c值是不確定的。

方案二:改寫SQL

案例二:NO_ZERO_DATE & NO_ZERO_IN_DATE & time_zone

問題描述

排錯階段一

MySQL版本從5.6升級至5.7之后,創建表的過程中失敗:

mysql> CREATE TABLE `t_manager` (  .....  ->  `CREATE_DATETIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',  ->  `MODIFIER` varchar(32) DEFAULT NULL COMMENT '更新人',  ->  `MODIFY_DATETIME` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時間',  ->  `IS_DELETED` bit(1) DEFAULT b'0' COMMENT '刪除狀態 1:刪除 0:未刪除',  ->  `IS_ENABLE` bit(1) DEFAULT b'1' COMMENT '啟用狀態 1:啟用 0:禁用',  ->  PRIMARY KEY (`CACHE_ID`)  -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;ERROR 1067 (42000): Invalid default value for 'MODIFY_DATETIME'

錯誤提示 MODIFY_DATETIME 字段設置的默認值是無效的,考慮到剛從5.6版本升級到5.7版本,于是又去翻了翻5.7中默認的 sql_mode 值。結果發現了兩個可能存在影響的選項:

NO_ZERO_DATE
NO_ZERO_IN_DATE

排錯階段二

于是解決方案就是按照 NO_ZERO_DATE 以及 NO_ZERO_IN_DATE 的要求設置默認值,將 MODIFY_DATETIME 字段默認值設置為'1001-01-01 01:01:01',結果發現還是無法成功創建表:

mysql>CREATE TABLE `t_manager` (  .....  ->  `CREATE_DATETIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',  ->  `MODIFIER` varchar(32) DEFAULT NULL COMMENT '更新人',  ->  `MODIFY_DATETIME` timestamp NOT NULL DEFAULT '1001-01-01 01:01:01' ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時間',  ->  `IS_DELETED` bit(1) DEFAULT b'0' COMMENT '刪除狀態 1:刪除 0:未刪除',  ->  `IS_ENABLE` bit(1) DEFAULT b'1' COMMENT '啟用狀態 1:啟用 0:禁用',  ->  PRIMARY KEY (`CACHE_ID`)  -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;ERROR 1067 (42000): Invalid default value for 'MODIFY_DATETIME'

查看了所有的 sql_mode 值,都符合規范,但是表還是創建不成功。只好去官方手冊上找找timestamp介紹:

The TIMESTAMP data type is used for values that contain both date and time parts. TIMESTAMP has a range of ‘1970-01-01 00:00:01' UTC to ‘2038-01-19 03:14:07' UTC.

排錯階段三

可以看到官方定義中timestamp字段值的范圍是'1970-01-01 00:00:01'到'2038-01-19 03:14:07',原來是我們設置的默認值不在timestamp范圍之內。于是再次修改默認值:

mysql>CREATE TABLE `t_manager` (  .....  ->  `CREATE_DATETIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',  ->  `MODIFIER` varchar(32) DEFAULT NULL COMMENT '更新人',  ->  `MODIFY_DATETIME` timestamp NOT NULL DEFAULT '1970-01-01 00:00:01' ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時間',  ->  `IS_DELETED` bit(1) DEFAULT b'0' COMMENT '刪除狀態 1:刪除 0:未刪除',  ->  `IS_ENABLE` bit(1) DEFAULT b'1' COMMENT '啟用狀態 1:啟用 0:禁用',  ->  PRIMARY KEY (`CACHE_ID`)  -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;ERROR 1067 (42000): Invalid default value for 'MODIFY_DATETIME'

邪了門,居然還是無法成功創建表。實在是沒轍了,向同事求救,同事說他在機器上試試,結果同樣的語句在他的MySQL上執行成功,同樣是5.7.23版本。

百思不得其解。

一氣之下將兩邊的參數值拿出來對比了一下,果然找到了不同的根本。

 

測試環境 同事環境
system_time_zone=CST system_time_zone UTC
time_zone='+08:00' time_zone=SYSTEM

 

回過頭來看timestamp字段定義的范圍:

The TIMESTAMP data type is used for values that contain both date and time parts. TIMESTAMP has a range of ‘1970-01-01 00:00:01' UTC to ‘2038-01-19 03:14:07' UTC.

這個時間范圍指的是UTC時區的時間范圍,測試環境設置了CST東八區的時區,則對應的時間范圍上也需要對應的加8小時。所以將timestamp字段默認值修改為'1970-01-01 08:00:01',表終于創建成功。

mysql>CREATE TABLE `mn_cache_refresh_manager` (  ......  ->  `CREATE_DATETIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',  ->  `MODIFIER` varchar(32) DEFAULT NULL COMMENT '更新人',  ->  `MODIFY_DATETIME` timestamp NOT NULL DEFAULT '1970-01-01 08:00:01' ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時間',  ->  `IS_DELETED` bit(1) DEFAULT b'0' COMMENT '刪除狀態 1:刪除 0:未刪除',  ->  `IS_ENABLE` bit(1) DEFAULT b'1' COMMENT '啟用狀態 1:啟用 0:禁用',  ->  PRIMARY KEY (`CACHE_ID`)  -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;Query OK, 0 rows affected (0.02 sec)

總結

以上所述是小編給大家介紹的MySQL5.7中的sql_mode默認值帶來的坑及解決方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人在线一区二区| 午夜精品在线视频| 毛片精品免费在线观看| 最近2019好看的中文字幕免费| 国产精品成人免费电影| 日产精品久久久一区二区福利| 亚洲经典中文字幕| 国产精品第一视频| 国产91精品黑色丝袜高跟鞋| 96sao精品视频在线观看| 亚洲天堂开心观看| 成人黄色短视频在线观看| 国产午夜精品麻豆| 欧美激情视频免费观看| 国模精品视频一区二区| 中文字幕欧美国内| 岛国视频午夜一区免费在线观看| 亚洲精品在线看| 国产精品爽爽ⅴa在线观看| 久久人人爽国产| 成人黄色av播放免费| 亚洲精品自产拍| 日韩电影免费观看在线观看| 欧美大片网站在线观看| 国产欧美日韩91| 日韩电影中文 亚洲精品乱码| 国产精品ⅴa在线观看h| 国产亚洲精品激情久久| 久久久人成影片一区二区三区观看| 国产男人精品视频| 成人免费淫片aa视频免费| 久久久久北条麻妃免费看| 97精品久久久| 欧美亚洲国产精品| 国产亚洲一区二区在线| 一区二区亚洲精品国产| 在线亚洲欧美视频| 欧美色另类天堂2015| 欧美性极品少妇精品网站| 亚洲精品在线观看www| 久久久精品一区二区三区| 亚洲精品久久在线| 美女黄色丝袜一区| 日韩在线视频二区| 亚洲三级av在线| 91香蕉亚洲精品| 91av视频在线观看| 中文字幕少妇一区二区三区| 91在线|亚洲| 亚洲一区二区久久久久久久| 亚洲国产成人精品久久久国产成人一区| 久久精品99无色码中文字幕| 午夜精品在线观看| 欧美裸体xxxxx| 亚洲一区二区久久久久久| 精品国模在线视频| 亚洲精品久久久久中文字幕二区| 亚洲第一页中文字幕| 欧美亚洲成人精品| 综合av色偷偷网| 亚洲综合在线做性| 欧美日韩国内自拍| 国产精品久久久久不卡| 国产精品久久久久久久久影视| 国产欧美日韩中文| 亚洲最大的av网站| 中文字幕亚洲专区| 亚洲国产精品一区二区三区| 亚洲天堂精品在线| 欧美成人手机在线| www.欧美免费| 亚洲成人三级在线| 欧美大片第1页| 亚洲福利视频在线| 136fldh精品导航福利| 国产精品成人在线| 欧美老少做受xxxx高潮| 国产精品中文在线| 国产视频在线观看一区二区| 亚洲无限av看| 日韩av一卡二卡| 亚洲国产精品久久91精品| 91精品视频一区| 欧美乱妇高清无乱码| 国产美女扒开尿口久久久| 国产在线拍揄自揄视频不卡99| 日韩中文在线中文网在线观看| 永久免费看mv网站入口亚洲| 国产日韩精品在线播放| 欧美一区第一页| 久久久精品日本| 欧美精品激情在线| 中文字幕精品一区二区精品| 国外色69视频在线观看| 亚洲精品91美女久久久久久久| 日韩电视剧在线观看免费网站| 欧美性生交xxxxxdddd| 爽爽爽爽爽爽爽成人免费观看| 日韩一级裸体免费视频| 国产午夜精品理论片a级探花| 亚洲国产天堂网精品网站| 福利视频第一区| 欧美天堂在线观看| 亚洲成人黄色在线| 91性高湖久久久久久久久_久久99| 亚州精品天堂中文字幕| 亚洲sss综合天堂久久| 亚洲精品永久免费精品| 日韩成人av网| 久久亚洲成人精品| 亚洲欧美日韩精品久久奇米色影视| 日韩精品中文字幕在线播放| 国产精品夫妻激情| 国产精品成人免费电影| 精品久久久免费| 成人免费看吃奶视频网站| 亚洲国产精品视频在线观看| 亚洲国产精品悠悠久久琪琪| 亚洲国产精品人久久电影| 亚洲人成毛片在线播放| 欧美激情第三页| 成人精品网站在线观看| 中文字幕日韩精品在线| 亚洲精品免费网站| 日韩在线播放一区| 精品久久久999| 欧美精品少妇videofree| 欧美日韩日本国产| 97超级碰碰人国产在线观看| 国产欧美在线看| 国产日韩在线免费| 国产一区二区激情| 2019中文字幕全在线观看| 日韩中文在线中文网在线观看| 亚洲美女av电影| 亚洲美女视频网| 色偷偷88888欧美精品久久久| 久久99国产精品久久久久久久久| 国产丝袜一区二区三区免费视频| 国产精品v片在线观看不卡| 欧美性jizz18性欧美| 精品女同一区二区三区在线播放| 午夜精品久久久久久久白皮肤| 国产欧美日韩中文| 91免费在线视频网站| 亚洲无av在线中文字幕| 久久97久久97精品免视看| 久久噜噜噜精品国产亚洲综合| 欧美成人四级hd版| 91国语精品自产拍在线观看性色| 91精品久久久久久| 国产精品久久久久久久天堂| 精品一区二区亚洲| 51久久精品夜色国产麻豆| 国产69精品久久久久9999| 成人性教育视频在线观看| 一区二区在线视频| 亚洲成人网久久久| 国产精品美女网站| 欧美成人午夜剧场免费观看| 久久久久久久亚洲精品| 日韩动漫免费观看电视剧高清| 国产精品va在线播放我和闺蜜| 国产91精品高潮白浆喷水|