LoginSignup
3
2

More than 5 years have passed since last update.

「Movable Type 6.3 より前のバージョンでは、MySQL5.6 / 5.7 では、sql_mode が 初期状態では動作しません」とはどういうことなのか

Posted at

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でエントリーが作成できないのでした。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2