Movable Type 6のドキュメントの「注意事項、制限事項と既知の問題点」の「既知の問題」部分に以下の記述があります。
Movable Type 6.3 より前のバージョンでは、MySQL5.6 / 5.7 では、sql_mode が 初期状態では動作しません。
いまいちはっきりとしない書き方ですが、これはMySQL5.6以降でsql_mode
の初期値にSTRICT_TRANS_TABLES
が設定されるようになったため、SQLモード1が厳密モードになっているMySQLでは動かないということを示しています。なのですが、普通にMovable Typeの管理画面を使用していると特にエラーになるような機能などは無く、普通に使えてしまいます。
が、遂にこれが原因であろうエラーに遭遇しました。
Data APIを使ってカスタムフィールドの存在するエントリーを追加すると以下のエラーが発生します。
Failed to execute INSERT INTO mt_entry_meta
(entry_meta_entry_id, entry_meta_type, entry_meta_vchar, entry_meta_vchar_idx, entry_meta_vdatetime, entry_meta_vdatetime_idx, entry_meta_vinteger, entry_meta_vinteger_idx, entry_meta_vfloat, entry_meta_vfloat_idx, entry_meta_vblob, entry_meta_vclob)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
with entry_id, type, vchar, vchar_idx, vdatetime, vdatetime_idx, vinteger, vinteger_idx, vfloat, vfloat_idx, vblob, vclob: DBD::mysql::st execute failed: Incorrect integer value: '' for column 'entry_meta_vinteger_idx' at row 1 at /var/www/htdocs/extlib/Data/ObjectDriver/Driver/DBI.pm line 396.
entry_meta_vinteger_idx
カラムの型はint(11)
で、そこに''
を入れようとしていますが、空文字列を数値に変換できずにエラーになっているようです。
mt_entry_meta
テーブルはカスタムフィールドの値などを保存するためのテーブルです。MTのmeta系のテーブルは何でも保存できるテーブルとして設計されていて、entry_meta_type
に保存する値の種類を入れ、保存したい値の型ごとにカラムが用意されているという構造になっています。entry_meta_vinteger_idx
カラムは整数型の値用のインデックスの張られたカラムです。このような構造なので種類によって使わないカラムが出てくるわけですが、そのようなカラムにはNULL
が入るようです。つまりNULL
を入れようとして''
を指定しているのではないかと思われます。エラーが起こるカラムがentry_meta_vinteger_idx
なのはINSERT
文に指定されたカラムのうち、最初の文字列形以外のカラムだからということですね。
ということで、Movable Type 6.3 より前のバージョンでSQLモードが厳密モードになっているMySQLを使うと、数値を保存するタイプ以外のカスタムフィールドがあるとData APIでエントリーが作成できないのでした。