MySQLのSQLモード確認と変更方法

MySQLのSQLモード確認と変更方法

MySQL5.7.24にSQLモードというモードがあったのでメモです。

mysql> SELECT @@global.sql_mode;
+----------------------------------------------------------------+
| @@global.sql_mode |
+----------------------------------------------------------------+
| STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+----------------------------------------------------------------+
1 row in set (0.00 sec)

デフォルトではこのSQLモードが設定されています。

ONLY_FULL_GROUP_BYが指定されていないので、GROUP BY句で指定していないカラムがSELECT句で指定できてしまいます。

SELECT SUM(DEPOSIT_AMOUNT),ID,ACCOUNT_NUMBER -- ACCOUNT_NUMBERが指定できてしまう
FROM GINKOU.ACCOUNT 
GROUP BY ID; -- IDごと

このSQLはOracleだとエラーになりますが、MySQLではmy.cnfの設定次第でいけてしまいます。

ONLY_FULL_GROUP_BYを指定する

my.cnf(Windowsの場合はmy.ini)のファイルを修正します。

my.cnfの場所は以下コマンドの結果の場所です。

mysql --help | grep my.cnf

my.iniの場所は以下です。

C:\ProgramData\MySQL\MySQL Server 5.7\my.ini

my.iniを修正します。

# Set the SQL mode to strict
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,ONLY_FULL_GROUP_BY"

my.iniを修正したらMySQLを再起動します。

サービス再起動したらSQLモードを確認します。

mysql> SELECT @@global.sql_mode;
+-----------------------------------------------------------------------------------+
| @@global.sql_mode |
+-----------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-----------------------------------------------------------------------------------+
1 row in set (0.00 sec)

ONLY_FULL_GROUP_BYが追加されていることが確認できます。

これでGROUP BYで指定していないカラムをSELECT句で指定するとエラーとなります。

コメント

タイトルとURLをコピーしました