【Laravel】mysql struct の注意点
Laravel
では mysql
への接続オプションとして strict
(厳密)モードがあり気をつける必要があります。
strict 設定
config/database.php
の mysql => strict
の値が true
だと有効になっています。
デフォルトの設定では true
です。
Laravel 9.x config/database.php
|
|
strict の内容
以下のソースに strict
の内容が記載されています。
Laravel 9.x src/Illuminate/Database/Connectors/MySqlConnector.php
Mysql 8.0.11 以降の設定set session sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
Mysql 8.0.11 未満の設定set 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'
|
|
strict 解説
ONLY_FULL_GROUP_BY
- GROUP BY句 で指定されてない非集計カラムを許可
- MySQL :: MySQL 8.0 リファレンスマニュアル :: 12.20.3 MySQL での GROUP BY の処理
STRICT_TRANS_TABLES
- 無効な値に対して近似値などを入れることなくエラーとする
- MySQL :: MySQL 5.6 リファレンスマニュアル :: 1.7.3.3 無効データの制約
NO_ZERO_IN_DATE
- 無効な日時の挿入を禁止
- <a href=“https://dev.mysql.com/doc/refman/5.6/ja/sql-mode.html#name="sqlmode_no_zero_in_date"" target="_blank” rel=“nofollow noopener”>MySQL :: MySQL 5.6 リファレンスマニュアル :: 5.1.7 サーバー SQL モード
NO_ZERO_DATE
0000-00-00
の日付を禁止- MySQL :: MySQL 5.6 リファレンスマニュアル :: 5.1.7 サーバー SQL モード
ERROR_FOR_DIVISION_BY_ZERO
0
の禁止。無効だとNULL
が入る。- MySQL :: MySQL 5.6 リファレンスマニュアル :: 5.1.7 サーバー SQL モード
NO_AUTO_CREATE_USER
- 自動的に新規ユーザを作成しない
- MySQL :: MySQL 5.6 リファレンスマニュアル :: 5.1.7 サーバー SQL モード
NO_ENGINE_SUBSTITUTION
- 目的のストレージエンジンが利用できない場合にエラーが発生し、テーブルは作成または変更されません。
- MySQL :: MySQL 5.6 リファレンスマニュアル :: 5.1.7 サーバー SQL モード
個別に各種オプションを設定する
strict
で一括で諸々の設定を有効にするのではなく個別にちゃんと設定したい場合は modes
を追加することで可能です。
|
|