2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【mysql8.0】ERROR 1406 (22001): Data too long for column '?' at row 1を無視したい

Posted at

はじめに

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 モード
厳密モードでは、最大キー長を超えるキーを作成しようとするとエラーが発生します。 厳密モードが有効になっていない場合、これにより警告が発生し、キーが最大キー長に切り捨てられます。

というわけで、これをオフにすれば処理を中断せずに入りきらない部分を切り捨てて入れてくれるようになる

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?