「広告」

MySQL 5.6 からの移行、[Incorrect integer]エラー。過去の資産を・・・

「広告」
記事内に広告が含まれています。
「広告」

MySQL 5.6時代のphp遺産を、MySQL 5.7、MySQL 8.0で稼働させる・・・
本来は、ソースを見直して、今の時代にあった書き方をすればいいですが・・・
「とりあえず動かしたい」という場合に・・・(笑)

「広告」

ERROR 1366 (HY000): Incorrect integer

MySQL 5.7以降、intタイプに「空文字」を入れようとすると、エラーになります。

mysql> desc test01;
+--------+------+------+-----+---------+-------+
| Field  | Type | Null | Key | Default | Extra |
+--------+------+------+-----+---------+-------+
| suji_1 | int  | YES  |     | NULL    |       |
| moji_2 | text | YES  |     | NULL    |       |
+--------+------+------+-----+---------+-------+
2 rows in set (0.00 sec)

↑ という、「int」と「text」のテーブルがあったとして、

mysql> insert into test01 (suji_1,moji_2) values ("","");
ERROR 1366 (HY000): Incorrect integer value: '' for column 'suji_1' at row 1

mysql> insert into test01 (suji_1,moji_2) values ('',"");
ERROR 1366 (HY000): Incorrect integer value: '' for column 'suji_1' at row 1

↑ というように、「int」に「””」と空文字を入れると、エラーになります。
きちんと、「数字」を入れるように!
ということです。

「広告」

解決策 その1 きちんと数字を

mysql> insert into test01 (suji_1,moji_2) values (0,"");
Query OK, 1 row affected (0.01 sec)

↑ と、きちんと、数字を入れましょう・・・

「広告」

解決策 その2 sql_mode 変更 セッション

「ERROR 1366 (HY000): Incorrect integer」のエラーは、
「sql_mode」の「STRICT_TRANS_TABLES」の設定が原因です。

mysql> SHOW VARIABLES LIKE 'sql_mode';
+---------------+-----------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value                                                                                                                 |
+---------------+-----------------------------------------------------------------------------------------------------------------------+
| sql_mode      | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+---------------+-----------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

↑ MySQL 8.0 では、上記のように設定がなされています。

mysql> SHOW VARIABLES LIKE 'sql_mode';
+---------------+------------------------+
| Variable_name | Value                  |
+---------------+------------------------+
| sql_mode      | NO_ENGINE_SUBSTITUTION |
+---------------+------------------------+
1 row in set (0.00 sec)

↑ ちなみに、過去の5.6.13 というバージョンでは、このような設定でした。

mysql> SET SESSION sql_mode = ''
Query OK, 0 rows affected (0.00 sec)

↑sql_modeを無効にしてみます。
mysqli_query など、phpから行う時も同様です。
DB接続のたびに(セッション毎に)、sql_modeを設定します。

mysql> insert into test01 (suji_1,moji_2) values ("","");
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from test01;
+--------+--------+
| suji_1 | moji_2 |
+--------+--------+
|      0 |        |
+--------+--------+
1 row in set (0.00 sec)

↑  MySQL 5.6 時代の動作と同じように、空文字で、「0」(ゼロ)が入りました。

「広告」

解決策 その3 sql_mode 変更 mysqld起動時

サーバーのMySQL起動時に設定をします。
セッション毎に「SET SESSION sql_mode = ”」というSQLを発行しなくても「いい」ことになります。

# vi /etc/my.cnf.d/mysql-server.cnf

[mysqld]

sql_mode=NO_ENGINE_SUBSTITUTION

↑ [mysqld」のセッションに、「sql_mode」の行を加えます。
上記は、MySQL 5.6.13と同じ設定です。

MySQLを再起動します。

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