MySQL 5.7でエラー発生 [PDOException] SQLSTATE[42000]: Syntax error or access violation: 1055 Expression

MySQL

MySQL

サーバー移転の際に、MySQLを5.5から5.7にアップグレードしたのだけど、このアップグレードが原因でバッチログに大量のエラーが出力されていることが判明。

5.5へのダウングレードなども検討したけど、5.7のままで解決したので備忘録。

エラーログ

出力されていたのは主に下記二つのエラー
ともに、最後に[sql_mode=only_full_group_by]という記述がある。

[PDOException] SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #18 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'databasename.tablename.column' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
[PDOException] SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1  of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'databasename.tablename.column' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

sql_modeの調査結果

どうやらMySQLのsql_modeというものがバージョンが上がる度に変わっているらしい。
5.5から5.7の初期値はそれぞれ下記の通り。

バージョン sql_modeの初期値
5.5 NO_ENGINE_SUBSTITUTION
5.6 NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
5.7 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」という項目がエラーの原因だったらしい。

MySQLではもともと、GROUP BY句を利用する際に、SELECTとGRUOP BYが一致していなくても動作していました。
(標準SQL的には違反)

これが、5.7でデフォルトで許可しないようになったようで、sql_modeを変更することで対応しました。

対応方法

/etc/my.cnf を下記のように修正してmysqldを再起動しました。

# 前略

[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION

# 後略

これで無事、システム改修せずにエラーを修正できた。

めでたしめでたし

シェアする

  • このエントリーをはてなブックマークに追加

フォローする