您好,登錄后才能下訂單哦!
本篇內容主要講解“mysql中ERROR 1055(42000)報錯怎么解決”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“mysql中ERROR 1055(42000)報錯怎么解決”吧!
報錯:
ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'work_ad.api_community_pic.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
字面意思理解是sql_model=only_full_group_by限制了,導致在以往MYSQL版本中能正常查詢的SQL,在5.7不能用了
文檔指出:ONLY_FULL_GROUP_BY的設定,將不允許查詢字段包括非聚集列
查詢mysql服務器版本:
select @@version顯示:5.7.10
#查看sql_mode的語法
select @@GLOBAL.sql_mode;select @@SESSION.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
only_full_group_by:使用這個就是使用和oracle一樣的group 規則, select的列都要在group中,或者本身是聚合列(SUM,AVG,MAX,MIN) 才行,其實這個配置目前個人感覺和distinct差不多的,所以去掉就好
方法一:
查詢mysql 1055錯誤碼發現問題為在mysql的配置中如果設置了sql_mode包含ONLY_FULL_GROUP_BY值得話,在進行查詢時需要將select的字段都包含在group by 中。
即 select x,y from xxx group by x,y
否則就會報錯
但是查看自己的配置my.cnf發現在sql_mode中并沒有ONLY_FULL_GROUP_BY這個值
然后去查看Laravel的配置文件,config/database.php,查找mysql的配置,
'mysql' => ['driver' => 'mysql','host' => env('DB_HOST', 'localhost'),'port' => env('DB_PORT', '3306'),'database' => env('DB_DATABASE', 'forge'),'username' => env('DB_USERNAME', 'forge'),'password' => env('DB_PASSWORD', ''),'charset' => 'utf8','collation' => 'utf8_unicode_ci','prefix' => env('DB_PREFIX',''),'strict' => true,'engine' => null,],
發現有個strict項,默認為true,上網也沒有查找到相關解釋,根據字面意思猜測可能為是否開啟嚴格模式,將其修改為false,再次測試發現問題解決,可以輸出正確結果
方法二:
#修改sql_mode的語法
通過修改配置文件my.cnf來解決這個問題的。
1. 關閉正在運行的mysql2. 修改/etc/my.cnf,將sql_mode=中的only_full_group_by給刪掉3. 重啟mysql,再執行出錯的sql發現能成功執行了
ONLY_FULL_GROUP_BY:對于GROUP BY聚合操作,如果在SELECT中的列,沒有在GROUPBY中出現,那么這個SQL是不合法的,因為列不在GROUP BY從句中 NO_AUTO_VALUE_ON_ZERO:該值影響自增長列的插入。默認設置下,插入0或NULL代表生成下一個自增長值。如果用戶希望插入的值為0,而該列又是自增長的,那么這個選項就有用了。 STRICT_TRANS_TABLES:在該模式下,如果一個值不能插入到一個事務表中,則中斷當前的操作,對非事務表不做限制NO_ZERO_IN_DATE:在嚴格模式下,不允許日期和月份為零 NO_ZERO_DATE:設置該值,mysql數據庫不允許插入零日期,插入零日期會拋出錯誤而不是警告。 ERROR_FOR_DIVISION_BY_ZERO:在INSERT或UPDATE過程中,如果數據被零除,則產生錯誤而非警告。如果未給出該模式,那么數據被零除時MySQL返回NULL NO_AUTO_CREATE_USER:禁止GRANT創建密碼為空的用戶 NO_ENGINE_SUBSTITUTION:如果需要的存儲引擎被禁用或未編譯,那么拋出錯誤。不設置此值時,用默認的存儲引擎替代,并拋出一個異常 PIPES_AS_CONCAT:將”||”視為字符串的連接操作符而非或運算符,這和Oracle數據庫是一樣的,也和字符串的拼接函數Concat相類似 ANSI_QUOTES:啟用ANSI_QUOTES后,不能用雙引號來引用字符串,因為它被解釋為識別符
升級MYSQL5.7是為了更好的性能,據我猜測,MYSQL5.7對sql_mode的限制,也是為了更好的查詢性能。所以如果在開發階段,如果要使用mysql5.7版本建議大家閱讀一下5.7的文檔,然后將自己的sql寫的更嚴謹,盡量少用select * ,只查出自己想要的數據列即可。
由于 我的程序邏輯上只要不同的ip,和最后登錄時間,所以 我的SQL改成以下:
SELECT ip,max(last_login) last_login FROM `sdb_login_log` group by ip;
到此,相信大家對“mysql中ERROR 1055(42000)報錯怎么解決”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。