はじめに
mysqlにデータを挿入or更新するとき、たまに更新しようとした値が長すぎて怒られることがある
SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column '?' at row 1 (Connection: mysql, SQL: update `?` set `?` = とっても長いメッセージ
長いデータを入れてごめん。だけど処理を中断しないでくれ。このデータの内容がすべて入っているかどうかは重要じゃないんだ。長い分を切り落として処理を続けてくれよ。をしたかった。
環境
mysql(8.0.37)
解決法
デフォルトでONになっているSTRICT_TRANS_TABLES
をオフにする
以下手順
デフォルトでオンになっている項目を確認
mysql> SELECT @@GLOBAL.sql_mode;
+----------------------------------------------------------------------------------------
-------------------------------+
| @@GLOBAL.sql_mode
|
+----------------------------------------------------------------------------------------
-------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_
BY_ZERO,NO_ENGINE_SUBSTITUTION |
+----------------------------------------------------------------------------------------
-------------------------------+
私の場合は以下の設定が有効の状態(8.0のデフォルトの状態)
- ONLY_FULL_GROUP_BY
- STRICT_TRANS_TABLES
- NO_ZERO_IN_DATE
- NO_ZERO_DATE
- ERROR_FOR_DIVISION_BY_ZERO
- NO_ENGINE_SUBSTITUTION
表題の例外を投げるのはSTRICT_TRANS_TABLESなので、それをオフにする
mysql> SET GLOBAL sql_mode = 'ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
一応確認
mysql> SELECT @@GLOBAL.sql_mode;
+---------------------------------------------------------------------------------------------------+
| @@GLOBAL.sql_mode |
+---------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+---------------------------------------------------------------------------------------------------+
STRICT_TRANS_TABLESだけオフになっていることを確認
STRICT_TRANS_TABLESとは
厳密な SQL モード
厳密モードでは、最大キー長を超えるキーを作成しようとするとエラーが発生します。 厳密モードが有効になっていない場合、これにより警告が発生し、キーが最大キー長に切り捨てられます。
というわけで、これをオフにすれば処理を中断せずに入りきらない部分を切り捨てて入れてくれるようになる