Edited at

ALLOW_INVALID_DATESなお話

More than 5 years have passed since last update.

現行PJの修正のためローカル環境にクローン作ったのです。

INSERTでエラーがぽつりぽつり出てておかしいなぁっと。

DateフィールドやDateTimeフィールドへの挿入で''空文字としてインサートしてる箇所がエラーとなってます。

FuelPHPのorm葉っぱーなどのコア周りを見てるとデータが指定されない場合はデフォルトをDB構造から読み取ってセットしているっぽい動きをしている。

検証環境のMariaDBならエラー無しで show create table も同じ…

環境要因ですね

調べるとありました。


my.ini でsql-modeを指定するそうです

MySQL :: MySQL 5.6 Reference Manual :: 5.1.7 Server SQL Modes http://dev.mysql.com/doc/refman/5.6/en/sql-mode.html


[mysqld]

# Set the SQL mode to strict

# sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

sql-mode="ALLOW_INVALID_DATES"


※ sql-mode="" or sql_mode="" どちらでも良いようです。元々置いてあるmy.iniに合わせましょう

ALLOW_INVALID_DATES を指定すると日付に無効な値を指定してもエラーとせず 0 で挿入可能になります。

あまり薦められたものじゃないですがMySQLをバージョンアップして厳密になってそれまでのコードが動かないとなれば話は別です。

これで解決なのですが軽くハマっていたのでもう少し書きます


sql_modeオプション変更後の確認

c:\Program Files\MySQL\MySQL Server 5.6\bin>mysql -uroot -proot

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

mysql> exit
Bye

c:\Program Files\MySQL\MySQL Server 5.6\bin>mysql -uroot -proot
mysql> select @@sql_mode;
+---------------------+
| @@sql_mode |
+---------------------+
| ALLOW_INVALID_DATES |
+---------------------+
1 row in set (0.00 sec)

mysql>

上が変更前、下が変更後です


my.ini の場所

環境:

windows7 Professional

MySQL 5.6

MySQLの起動はサービスで行っている

いつものようにプログラムフォルダにあるとおもいきや残念そこではなかったです

C:\ProgramData\MySQL\MySQL Server 5.6\my.ini

でした。

確認はサービスで起動しているのでサービスのコマンドラインを確認します。


  1. [コントロールパネル]開く

  2. ウィンドウ右上の検索テキストに service 入力

  3. [管理ツール - ローカルサービスの表示] クリック

  4. 名前:[MySQL56]を右クリックし[プロパティ]表示

  5. 開いた=全般=タブの[実行ファイルのパス]を確認する

    "C:\Program Files\MySQL\MySQL Server 5.6\bin\mysqld" --defaults-file="C:\ProgramData\MySQL\MySQL Server 5.6\my.ini" MySQL56

こんなところに直指定されてました。

んなことわかるかぁー(/・ω・)/にゃー!


結果

問題なく動作するようになりました。

これで良いとは思っていないw

FuelPHPってこの問題どうやって解決してるんだろう…調べませんけど…