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を再起動します。