最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL5.7中的sql_mode默認(rèn)值帶來(lái)的坑及解決方法

 更新時(shí)間:2018年11月01日 10:30:17   作者:Win-Man  
這篇文章主要介紹了MySQL5.7中的sql_mode默認(rèn)值帶來(lái)的坑及解決方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

在正常項(xiàng)目開發(fā)過(guò)程中,如果MySQL版本從5.6升級(jí)到5.7版本。作為DBA在考慮數(shù)據(jù)庫(kù)版本升級(jí)帶來(lái)的影響時(shí),一般會(huì)有幾個(gè)注意點(diǎn):

sql_mode
optimizer_switch

本文主要內(nèi)容是MySQL升級(jí)到5.7版本之后,由于默認(rèn)的 sql_mode 值帶來(lái)的坑以及對(duì)應(yīng)的解決方案。

案例一:ONLY_FULL_GROUP_BY

問題描述

MySQL版本從5.6升級(jí)至5.7之后,部分SQL執(zhí)行報(bào)錯(cuò),報(bào)錯(cuò)信息如下:

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

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

解決方案

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

ONLY_FULL_GROUP_BY 是加強(qiáng)SQL規(guī)范的,其目的是讓SQL查詢出來(lái)的結(jié)果更符合規(guī)范,更準(zhǔn)確。

如果沒有 ONLY_FULL_GROUP_BY 規(guī)范限制,那么則能允許以下SQL的執(zhí)行: SELECT a,b,c FROM t GROUP BY a 。SQL按照a字段值進(jìn)行分組,當(dāng)同一個(gè)a字段值對(duì)應(yīng)多個(gè)b或者c值時(shí),查詢結(jié)果中的b,c值是不確定的。

方案二:改寫SQL

案例二:NO_ZERO_DATE & NO_ZERO_IN_DATE & time_zone

問題描述

排錯(cuò)階段一

MySQL版本從5.6升級(jí)至5.7之后,創(chuàng)建表的過(guò)程中失?。?/p>

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

錯(cuò)誤提示 MODIFY_DATETIME 字段設(shè)置的默認(rèn)值是無(wú)效的,考慮到剛從5.6版本升級(jí)到5.7版本,于是又去翻了翻5.7中默認(rèn)的 sql_mode 值。結(jié)果發(fā)現(xiàn)了兩個(gè)可能存在影響的選項(xiàng):

NO_ZERO_DATE
NO_ZERO_IN_DATE

排錯(cuò)階段二

于是解決方案就是按照 NO_ZERO_DATE 以及 NO_ZERO_IN_DATE 的要求設(shè)置默認(rèn)值,將 MODIFY_DATETIME 字段默認(rèn)值設(shè)置為'1001-01-01 01:01:01',結(jié)果發(fā)現(xiàn)還是無(wú)法成功創(chuàng)建表:

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

查看了所有的 sql_mode 值,都符合規(guī)范,但是表還是創(chuàng)建不成功。只好去官方手冊(cè)上找找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.

排錯(cuò)階段三

可以看到官方定義中timestamp字段值的范圍是'1970-01-01 00:00:01'到'2038-01-19 03:14:07',原來(lái)是我們?cè)O(shè)置的默認(rèn)值不在timestamp范圍之內(nèi)。于是再次修改默認(rèn)值:

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

邪了門,居然還是無(wú)法成功創(chuàng)建表。實(shí)在是沒轍了,向同事求救,同事說(shuō)他在機(jī)器上試試,結(jié)果同樣的語(yǔ)句在他的MySQL上執(zhí)行成功,同樣是5.7.23版本。

百思不得其解。

一氣之下將兩邊的參數(shù)值拿出來(lái)對(duì)比了一下,果然找到了不同的根本。

測(cè)試環(huán)境 同事環(huán)境
system_time_zone=CST system_time_zone UTC
time_zone='+08:00' time_zone=SYSTEM

回過(guò)頭來(lái)看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.

這個(gè)時(shí)間范圍指的是UTC時(shí)區(qū)的時(shí)間范圍,測(cè)試環(huán)境設(shè)置了CST東八區(qū)的時(shí)區(qū),則對(duì)應(yīng)的時(shí)間范圍上也需要對(duì)應(yīng)的加8小時(shí)。所以將timestamp字段默認(rèn)值修改為'1970-01-01 08:00:01',表終于創(chuàng)建成功。

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

總結(jié)

以上所述是小編給大家介紹的MySQL5.7中的sql_mode默認(rèn)值帶來(lái)的坑及解決方法,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • 使用JDBC連接Mysql數(shù)據(jù)庫(kù)會(huì)出現(xiàn)的問題總結(jié)

    使用JDBC連接Mysql數(shù)據(jù)庫(kù)會(huì)出現(xiàn)的問題總結(jié)

    這篇文章主要給大家介紹了關(guān)于使用JDBC連接Mysql數(shù)據(jù)庫(kù)會(huì)出現(xiàn)的問題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10
  • mysql 8.0.22 zip壓縮包版(免安裝)下載、安裝配置步驟詳解

    mysql 8.0.22 zip壓縮包版(免安裝)下載、安裝配置步驟詳解

    這篇文章主要介紹了mysql 8.0.22 zip壓縮包版(免安裝)下載、安裝配置步驟詳解,本文分步驟通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • 構(gòu)建雙vip的高可用MySQL集群

    構(gòu)建雙vip的高可用MySQL集群

    大家好,本篇文章主要講的是構(gòu)建雙vip的高可用MySQL集群,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • MySQL中order?by的執(zhí)行過(guò)程

    MySQL中order?by的執(zhí)行過(guò)程

    這篇文章主要介紹了MySQL中order?by的執(zhí)行過(guò)程,一訂單表為例展開相應(yīng)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-06-06
  • mysql數(shù)據(jù)庫(kù)連接池配置教程

    mysql數(shù)據(jù)庫(kù)連接池配置教程

    在與數(shù)據(jù)庫(kù)進(jìn)行連接的時(shí)候,會(huì)牽扯到數(shù)據(jù)庫(kù)連接池的配置,本文將詳細(xì)介紹mysql數(shù)據(jù)庫(kù)連接池配置,需要了解跟多的朋友可以參考下
    2012-11-11
  • MySQL里的反斜杠(\\)的使用

    MySQL里的反斜杠(\\)的使用

    本文主要介紹了MySQL里的反斜杠(\\)的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • mysql使用SQLyog導(dǎo)入csv數(shù)據(jù)不成功的解決方法

    mysql使用SQLyog導(dǎo)入csv數(shù)據(jù)不成功的解決方法

    給mysql導(dǎo)入數(shù)據(jù),選中某個(gè)表選擇導(dǎo)入--導(dǎo)入使用本地csv數(shù)據(jù)即可,單有的時(shí)候不知道什么問題導(dǎo)入不成功
    2014-07-07
  • MYSQL使用Union將兩張表的數(shù)據(jù)合并顯示

    MYSQL使用Union將兩張表的數(shù)據(jù)合并顯示

    使用union操作符會(huì)將多張表中相同的數(shù)據(jù)取值一次,如果想將表1和表2中的值完整的顯示出來(lái),可以使用union all,今天通過(guò)本文給大家分享MYSQL使用Union將兩張表的數(shù)據(jù)合并顯示功能,需要的朋友參考下吧
    2021-08-08
  • CentOS下安裝MySQL5.6.10和安全配置教程詳解

    CentOS下安裝MySQL5.6.10和安全配置教程詳解

    這篇文章主要介紹了CentOS下安裝MySQL5.6.10和安全配置教的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-12-12
  • MySQL如何開啟遠(yuǎn)程連接權(quán)限

    MySQL如何開啟遠(yuǎn)程連接權(quán)限

    這篇文章主要介紹了MySQL如何開啟遠(yuǎn)程連接權(quán)限問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-09-09

最新評(píng)論

阳曲县| 齐河县| 曲水县| 海丰县| 贵阳市| 新疆| 中卫市| 曲松县| 泸定县| 娄底市| 香港| 华蓥市| 左云县| 库车县| 招远市| 海宁市| 个旧市| 肥西县| 荆州市| 双柏县| 岗巴县| 武穴市| 钟祥市| 普格县| 宾川县| 沂南县| 汉川市| 东乡县| 七台河市| 嘉善县| 嵊州市| 双辽市| 深泽县| 泰宁县| 南昌县| 广州市| 淮安市| 长垣县| 娱乐| 凤庆县| 奉化市|