XAMPP(Windows)環境で開発していたアプリの開発をMacで引き継ごうとしたら動かなくて困った件

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

XAMPPに便利なツールだと思います。
Apache MySQL PHP等が必要になった先にインストーラー一発で導入してくれ、開発作業にすぐに着手できるといったことになります。

ただ、XAMPPで開発していたアプリケーションを引きついで、Macで開発を行おうとするとハマルことがあります。

そういった具体例と対処方法についてご紹介します。

Insert文で値が抽出できない。

 
create database SelectSample; 
use SelectSample; 
CREATE TABLE UserInfo ( 
  UserID nchar(6), 
  UserName varchar(255), 
  AccessCount int(11) 
); 
insert into UserInfo(UserID,UserName,AccessCount) VALUES(1,'User',''); 

上記のSQL文をWindows(Xampp)環境で動かした場合と、Macで動かした場合で挙動が異なります。

Windwos(XAMPP)環境で実施

mysql> create database SelectSample;
Query OK, 1 row affected (0.01 sec)

mysql> use SelectSample;
Database changed
mysql> CREATE TABLE UserInfo (
    ->   UserID nchar(6),
    ->   UserName varchar(255),
    ->   AccessCount int(11)
    -> );
Query OK, 0 rows affected (0.12 sec)

mysql> insert into UserInfo(UserID,UserName,AccessCount) VALUES(1,'User','');
Query OK, 1 row affected, 1 warning (0.04 sec)

Mac環境で実施

mysql> create database SelectSample;
Query OK, 1 row affected (0.00 sec)

mysql> use SelectSample;
Database changed
mysql> CREATE TABLE UserInfo (
    ->   UserID nchar(6),
    ->   UserName varchar(255),
    ->   AccessCount int(11)
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> insert into UserInfo(UserID,UserName,AccessCount) VALUES(1,'User','');
ERROR 1366 (HY000): Incorrect integer value: '' for column 'AccessCount' at row 1

MacではInsert文が失敗していることがわかるかと思います。

失敗した理由はエラー内に書いてある通りになります。

ERROR 1366 (HY000): Incorrect integer value: '' for column 'AccessCount' at row 1

要は数値型のカラムに対し、値無しでInsert文を実行したことがエラーの原因となります。

ではなぜ、Windows(XAMPP)環境ではエラーとならなかったのでしょうか。

理由は起動しているMySQLのSQLモードがWindows(XAMPP)とMacで異なっているのが原因です。

以下のSQL文をそれぞれの環境で実行します。

select @@sql_mode;

Windwos(XAMPP)環境で実施

mysql> select @@sql_mode;
+------------+
| @@sql_mode |
+------------+
|            |
+------------+
1 row in set (0.00 sec)

Mac環境で実施

mysql> select @@sql_mode;
+--------------------------------------------+
| @@sql_mode                                 |
+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
1 row in set (0.03 sec)

WindowsではSTRICT_TRANS_TABLESが有効になっていないことがわかります。

その場合、MySQL側はカラムに入らない値が着た場合0を格納するといったことを行います。

MySQL :: MySQL 5.1 リファレンスマニュアル :: 1.8.6.2 無効値の制約

対処方法

MacのMySQLのSQLモードを変更するには以下のようにオプションをつけて起動することで、
Windows(XAMPP)で起動したMySQLと同じ状態にすることが可能です。

Mac環境で実施

mysql.server start --sql-mode=''
mysql -u root -p

mysql> select @@sql_mode;
+------------+
| @@sql_mode |
+------------+
|            |
+------------+
1 row in set (0.00 sec)

mysql> create database SelectSample;
Query OK, 1 row affected (0.00 sec)

mysql> use SelectSample;
Database changed
mysql> CREATE TABLE UserInfo (
    ->   UserID nchar(6),
    ->   UserName varchar(255),
    ->   AccessCount int(11)
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> insert into UserInfo(UserID,UserName,AccessCount) VALUES(1,'User','');
Query OK, 1 row affected, 1 warning (0.01 sec)

Macで起動したMySQLでも正しくInsertできました。

まとめ

Windows(XAMPP)環境では正しく動いてたコードが環境違うだけで、動かないと行ったことが起こると
何を疑っていいのやらと途方に暮れてしまいそうです。

そういったときに、SQLモードがおかしいのではと思い出していただければと思います。