MT4をMySQL3.23で無理やり動かす

なんとか過去ログのURLも含めて復旧終了。過去ログは98%くらいは以前のままのURLになったと思います。

事の発端はデザインを変えた後の再構築。再構築をかけてもまったく終わる気配がない。っていうか再構築されていない。一晩かけてもまったく終わらないのでいろいろいじってる内に完全におかしくなってしまったのでした(私が悪いんだけど)。

これとは別に、MT4に上げてから管理画面の記事一覧で、最初の20件は表示できるけど次の20件とかが表示できないという現象が発生していました。だけでもデフォルトの表示行数を100件とかにするとちゃんと表示できるのでDBが壊れているわけではなさそうだから、そのうち調べようと放置していました。

で、結果的には再構築できなかったのも記事一覧がちゃんと機能しなかったのも同じ原因でした。

再構築中のウィンドのソースを見ると、

mt.cgi?__mode=rebuild&blog_id=1&type=index&next=0&offset=&limit=~

という部分があり、このoffsetとlimitがあやしいんじゃないかとあたりをつけました。理由は、再構築したときも個別記事の最初の何件かはちゃんと再構築できていたから。

で、MovableTypeのソースからあやしそうな部分を探していったら、lib/MT/ObjectDriver/SQL.pmの263行目に

return sprintf "LIMIT %d%s\n", $n,
          ($o ? " OFFSET " . int($o) : "");

という部分がありました。SELECTの条件となるOFFSETの値を返すSQLを発行しているようですが、このサイトで使っているMySQLの書式では、

SELECT * FROM Table名 LIMIT offset値, 件数

だったはず(前にPHP+MySQLでいろいろ作っていた時に調べました)。しかし上記の書き方では、

SELECT * FROM Table名 LIMIT 件数 OFFSET offset値

になってしまいます。

で、さらに調べたところ、PostgreSQLでは後者の書式になっていて、MySQL4.0以降では互換性の為に後者の書式もサポートしているとのこと。そういえば、MovableType4の動作環境ってMySQL4.0以上でしたね。でもうちのMySQLは前に4.0.~に上げたはず・・・っと思って調べたら3.23.53でしたよ。あれ~?

いまさらMySQLのバージョンアップはメンドクサイので、SQL.pmの問題の個所を

return sprintf "LIMIT %s%d\n",
          ($o ? int($o) ." , " : ""), $n;

と書き換えて、無理やり書式を合わせてみました。とりあえずこれでちゃんと動くようなりました。

だけども、MySQLをバージョンアップしたほうがいいんだろうなぁ。

タグ: , , ,

back to top