Mysql only_full_group_by以及其他關於sql_mode原因報錯詳細解決方案

来源:http://www.cnblogs.com/chentging/archive/2017/09/08/7496551.html
-Advertisement-
Play Games

Mysql only_full_group_by以及其他關於sql_mode原因報錯詳細解決方案 網上太多相關資料,但是抄襲嚴重,有的講的也是之言片語的,根本不連貫(可能知道的人確實不想多說) 我總共花了3個多小時,反覆測試,總結一下 Mysql only_full_group_by以及其他關於sq ...


Mysql only_full_group_by以及其他關於sql_mode原因報錯詳細解決方案

網上太多相關資料,但是抄襲嚴重,有的講的也是之言片語的,根本不連貫(可能知道的人確實不想多說)
我總共花了3個多小時,反覆測試,總結一下

報錯信息:

1.ERROR 1055 (42000): Expression #7 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'postscan.verifyDelayLog.auditor' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

原因:

1.mysql 5.7中的sql_mode的值為:2.ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

怎麼查看呢:

1.我的mysql5.7部署在linux上的,然後我使用navicat 12連接的,就說怎麼使用navicat 12查看吧2.使用navicat 打開資料庫,然後工具-->命令列界面 (快捷方式F63.然後輸入:SELECT @@sql_mode;4.看到值為:5.ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

解決辦法1:

1.我所使用的mysql運行時指定的配置如下:2./apps/mysql5.7.18/bin/mysqld --defaults-file=/apps/my3306.cnf --basedir=/apps/mysql5.7.18 --datadir=/apps/mysql/data/3306 --plugin-dir=/apps/mysql5.7.18/lib/mysql/plugin --user=mysql --log-error=/apps/mysql/data/3306/BJ-DYC-VM-5-106.err --open-files-limit=8192 --pid-file=/apps/mysql/data/3306/BJ-DYC-VM-5-106.pid --socket=/tmp/mysql_3306.sock --port=33063.4.那麼我修改的是/apps/my3306.cnf,你沒意見吧哈哈5.找到:6.sql_mode = "ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"7.8.修改為:9.sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"10.11.因為修改了mysql配置文件,所以重新啟動mysql12./apps/mysql5.7.18/bin/mysqld --defaults-file=/apps/my3306.cnf --basedir=/apps/mysql5.7.18 --datadir=/apps/mysql/data/3306 --plugin-dir=/apps/mysql5.7.18/lib/mysql/plugin --user=mysql --log-error=/apps/mysql/data/3306/BJ-DYC-VM-5-106.err --open-files-limit=8192 --pid-file=/apps/mysql/data/3306/BJ-DYC-VM-5-106.pid --socket=/tmp/mysql_3306.sock --port=3306

驗證一下:

1.進入命令列界面2.然後輸入:SELECT @@sql_mode;3.看到值為:4.STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION5.6.至此,你不用遵守:如下約定了:7.  對於GROUP BY聚合操作,如果在SELECT中的列,沒有在GROUP BY中出現,那麼這個SQL是不合法的,因為列不在GROUP BY從句中,所以對於設置了這個mode的資料庫,在使用group by 的時候,就要用MAX(),SUM(),ANT_VALUE()這種聚合函數,才能完成GROUP BY 的聚合操作。

解決辦法2

1.第二種辦法不用修改配置文件,使用navicat修改2.進入命令行界面(F6)3.輸入:SELECT @@GLOBAL.sql_mode;4.結果:ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION5.6.然後我們來修改sql_mode7.輸入:set GLOBAL sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION ';8.9.再運行你的sql:10.SELECT11.     id,ip12.FROM13.     ip_meta_backup14.GROUP BY15.     ip16.HAVING17.     count(ip) > 118.*****恭喜你,成功了*****19.20.21.22.然後你再運行你的sql是不是可以運行啦23.24.SET GLOBAL sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';25.26.SELECT @@GLOBAL.sql_mode;

解決辦法3

1.第三種辦法不用修改配置文件,使用navicat修改2.進入命令行界面(F6)3.輸入:SELECT @@sql_mode;              註意:這邊預設了session,完整的是:SELECT @@SESSION.sql_mode;4.結果:ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION5.6.然後我們來修改sql_mode7.輸入:set SESSION sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION ';8.9.再運行你的sql:10.SELECT11.     id,ip12.FROM13.     ip_meta_backup14.GROUP BY15.     ip16.HAVING17.     count(ip) > 118.*****還是報only_full_group_by錯*****19.20.##############解決方法###################21.22.在你查詢的語句之前set sql_mode23.24.set SESSION sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION ';25.SELECT26.     id,ip27.FROM28.     ip_meta_backup29.GROUP BY30.     ip31.HAVING32.     count(ip) > 133.以後再新建查詢(包含group by)語句也不用再加set sql_mode 直到你關閉這次連接為止34.35.36.37.38.然後你再運行你的sql是不是可以運行啦39.40.SET GLOBAL sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';41.42.SELECT @@GLOBAL.sql_mode;

對於辦法3解決的解釋

1.其實講第三種方法的時候說過SELECT @@sql_mode;  其實這邊預設了session,完整的是:SELECT @@SESSION.sql_mode;2.SESSION是當前會話的意思---->這句話就解釋了直到你關閉這次連接為止3.4.那為什麼在命令行set sql_mode,然後再新建查詢還是沒用呢?5.其實你只要在新建查詢中輸入SELECT @@sql_mode;你會發現你在命令行中的設置並沒有生效6.所以,我們只能重新在這次連接(會話)的新建查詢中重新set sql_mode,之後這次連接(這次會話)不再需要7.這一段語言解釋了“在你查詢的語句之前set sql_mode”這句話

對辦法2辦法3兩種方法的說明

1.這兩種set sql_mode方法,都會隨著在我部署linux上的mysql重啟而恢復到我指定的配置文件的my.cnf裡面設置的sql-mode選項中的內容2.這句話比較繞3.意思就是:linux上的mysql重啟後,你在navicat上設置的就不再有效,而是依據你指定的配置文件中的設定,就是my.cnf這個文件中設定

附上其他mode解釋

1.STRICT_TRANS_TABLES:       在該模式下,如果一個值不能插入到一個事務表中,則中斷當前的操作,對非事務表不做限制2.3.NO_ZERO_IN_DATE:           在嚴格模式下,不允許日期和月份為零4.5.NO_ZERO_DATE:              設置該值,mysql資料庫不允許插入零日期,插入零日期會拋出錯誤而不是警告。6.7.ERROR_FOR_DIVISION_BY_ZERO:在INSERTUPDATE過程中,如果數據被零除,則產生錯誤而非警告。如 果未給出該模式,那麼數據被零除時MySQL返回NULL8.9.NO_AUTO_CREATE_USER:       禁止GRANT創建密碼為空的用戶10.11.NO_ENGINE_SUBSTITUTION:    如果需要的存儲引擎被禁用或未編譯,那麼拋出錯誤。不設置此值時,用預設的存儲引擎替代,並拋出一個異常12.13.PIPES_AS_CONCAT:           將"||"視為字元串的連接操作符而非或運算符,這和Oracle資料庫是一樣的,也和字元串的拼接函數Concat相類似14.15.ANSI_QUOTES:               啟用ANSI_QUOTES後,不能用雙引號來引用字元串,因為它被解釋為識別符16.17.NO_AUTO_VALUE_ON_ZERO:     該值影響自增長列的插入。預設設置下,插入0NULL代表生成下一個自增長值。如果用戶 希望插入的值為0,而該列又是自增長的,那麼這個選項就有用了。

對於其他mode說明

1.其他的mode使用也無外乎更改配置文件,或者獨立更改(也就是方法23

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 正常在Activity中使用Fragment的生命周期,第一次啟動過程是onAtach()-onCreate()-onCreateView()-onViewCreated()-onActivityCreated()-onStart()-onResume();隨著Activity被退棧銷毀,Fragm ...
  • 綁定服務 右邊部分就是綁定服務的運行過程 這樣綁定的目的就是服務綁定者調用服務的方法,在我的樣例里就是體現為服務訪問者調用服務的show()方法 來張效果圖吧 分析: 1、第一步還是繼承服務類 2、第二步的話就是配置服務 3、第三步就是綁定服務 ...
  • 播放音樂案例 分析: 和上一篇文章的結構是一樣的,只不過我們需要在這裡裡面加上播放音樂的一些操作: 其實也就是調用系統的播放音樂的API而已,寫在服務裡面就好, //媒體播放器 private MediaPlayer player; 第一步,照樣找個類來繼承服務類 第二步,該配置的監聽服務也是要配置 ...
  • service 下圖昨天是沒被綁定的情況,右邊是被綁定的情況 看下測試的效果圖: 程式被關閉,服務還是會在後臺運行,再次運行程式,程式還是能啟動和停止服務 分析: 1、先整個類繼承服務類 2、然後去配置這個服務 fry.myService是上面那個類的路徑 3、再去啟動和停止服務 ...
  • 這裡實現的功能是從主頁佈局的fragment點擊跳轉到一個acitivity,然後頂部是一個切換的segment底部部是一個listview,點擊segment分段讓listview載入不同的內容。我這裡沒再使用viewpager,應該使用viewpager+listview也能實現。我這裡使用的算 ...
  • 通過案例我們發現“獲得連接”和“釋放資源”兩次代碼將在之後的增刪改查所有功能中都存在,開發中遇到此種情況,將採用工具類的方法進行抽取,從而達到代碼的重覆利用。 1、使用properties配置文件 開發中獲得連接的4個參數(驅動、URL、用戶名、密碼)通常都存在配置文件中,方便後期維護,程式如果需要 ...
  • 存儲過程和函數: 1.創建存儲過程和函數: 存儲過程: delimiter $$ create procedure proc_name() BEGIN 查詢語句; // 記得加分號 END $$ delimiter ; 函數: delimiter $$ create function func_na ...
  • DML(data manipulation language): 它們是SELECT、UPDATE、INSERT、DELETE,就象它的名字一樣,這4條命令是用來對資料庫里的數據進行操作的語言DDL(data definition language): DDL比DML要多,主要的命令有CREATE、 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...