關於docker上安裝的MySQL無法使用group by的問題

問題描述:同一段使用了group by來進行分組的SQL,在本地的MySQL執行是沒問題的,但放到docker上安裝的MySQL(版本是5.7)去執行就有問題,如下圖:

問題出現的原因:默認情況下,MySQL5.7鏡像中的sql_mode含有only_full_group_by,如果MySQL啓用了only_full_group_by SQL模式的話,MySQL將拒絕選擇列表,即不能使用group by

查看SQL模式可用下面這條SQL:

select @@global.sql_mode

本地MySQL與docker上安裝的MySQL的SQL模式的對比:

解決方案:修改MySQL的配置文件設置SQL模式(即將SQL模式默認有的only_full_group_by給去掉),在配置文件的[mysqld]節點下面加上

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

注意:網上有方法說是直接在連接工具裏執行以下SQL進行設置

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’;

這種方法親測無效且容器一重啓就又會恢復爲默認的SQL模式;網上還有方法說是進入容器,然後修改/etc/mysql/mysql.conf.d/mysqld.cnf文件進行配置,這種方法親測需要先給容器安裝vim命令,否則無法修改,因爲容器裏是沒有vim命令的;綜上,我的做法是先將已有的MySQL容器刪除(刪除前注意將數據備份),然後重新啓動容器並指定數據目錄和配置文件,指定數據目錄的目的是將容器內部的數據目錄映射到宿主機,這樣即使容器被刪除了那數據依然還在宿主機,指定配置文件的目是將宿主機上的配置文件映射覆蓋到容器內部,這樣如果要修改容器的配置文件的話,就直接修改宿主機上的

步驟:

  • 列出正在運行的容器
docker ps
  • 將MySQL容器停掉(注意停之前先將數據備份)
docker stop bd041f156ec9
  • 將MySQL容器刪除
docker rm bd041f156ec9
  • 重新啓動MySQL容器,指定數據目錄跟配置文件
docker run -d -p 3308:3306 -v /etc/my.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf -v /mySoft/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql5.7 mysql:5.7

#-v是將宿主機上的文件/文件夾與容器內部的文件/文件夾進行映射
#這裏是將宿主機上/etc目錄下的my.cnf文件與容器內部/etc/mysql/mysql.conf.d目錄下的mysqld.cnf文件進行映射,即容器內部使用的配置文件就是宿主機上的/etc/my.cnf文件
#同時還將宿主機上的/mySoft/mysql/data文件夾與容器內部的/var/lib/mysql文件夾進行映射,即容器內部的數據會保存到宿主機上的/mySoft/mysql/data目錄去

操作截圖如下:

  • 用連接工具測試啓動的MySQL能否連接上
  • 修改宿主機上的配置文件加上SQL模式的相關配置
vim /etc/my.cnf

操作截圖如下:

然後問題就解決了:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章