現行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
でした。
確認はサービスで起動しているのでサービスのコマンドラインを確認します。
- [コントロールパネル]開く
- ウィンドウ右上の検索テキストに service 入力
- [管理ツール - ローカルサービスの表示] クリック
- 名前:[MySQL56]を右クリックし[プロパティ]表示
- 開いた=全般=タブの[実行ファイルのパス]を確認する
"C:\Program Files\MySQL\MySQL Server 5.6\bin\mysqld" --defaults-file="C:\ProgramData\MySQL\MySQL Server 5.6\my.ini" MySQL56
こんなところに直指定されてました。
んなことわかるかぁー(/・ω・)/にゃー!
結果
問題なく動作するようになりました。
これで良いとは思っていないw
FuelPHPってこの問題どうやって解決してるんだろう…調べませんけど…