PR(記事内にアフィリエイト広告が含まれています)
スポンサーリンク
Nucleus

MySQL 5.x系の対応

いつの間にか、アーカイブリスト(タイトル一覧)で任意のカテゴリを選ぶとSQLエラーが出る状態になってました。

※カッコが二つ続くとNucleusで変換をかけてしまうので、一部全角のカッコが混じってます。
mySQL error with query SELECT DISTINCT(i.inumber) as itemid, i.ititle as title, i.ibody as body, m.mname as author, m.mrealname as authorname, UNIX_TIMESTAMP(i.itime) as timestamp, i.itime, i.imore as more, m.mnumber as authorid, i.icat as catid, i.iclosed as closed, c.cname as category FROM nucleus_item as i, nucleus_member as m, nucleus_category as c, nucleus_blog as b LEFT JOIN nucleus_plug_multiple_categories as p ON i.inumber=p.item_id WHERE i.iauthor=m.mnumber and i.icat=c.catid and i.idraft=0 and i.iblog=1 and ((i.inumber=p.item_id and (p.categories REGEXP "(^|,)44(,|$)" or i.icat=44)) or (p.item_id IS NULL and i.icat=44)) and i.itime<="2010-04-06 00:47:17" and b.bnumber = c.cblog ORDER BY i.itime DESC LIMIT 0,50: Unknown column 'i.inumber' in 'on clause'
Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in /var/www/home/takehana/public_html/cgi/nucleus/nucleus/libs/BLOG.php on line 174
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /var/www/home/takehana/public_html/cgi/nucleus/nucleus/libs/BLOG.php on line 213
Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in /var/www/home/takehana/public_html/cgi/nucleus/nucleus/libs/BLOG.php on line 222

「Unknown column ‘i.inumber’ in ‘on clause’」で検索してみたら、原因はレンタルサーバーのMySQLのバージョンが4.x系から5.x系へアップグレードされてた事でした。
どうもMySQLのバグがあるようで、joinの優先順位が変わっているらしいです(参考1参考2参考3)。参考URLの修正をしようかと NP_MultiCategory を開いてみたら、なんとすでに修正はされてました。
なんでだろうか、と思ってエラーのSQLでGREPしてみたら、原因は実は NP_TitleList でした。気がついてみたら当たり前でした、先入観はいけませんね。そういうわけで、下記部分を修正して、対応完了しました。

NP_TitleList の717行あたり
//2010/04/06_takehana_upd_s
//			$query .= ' FROM '.sql_table('item').' as i, '.sql_table('member').' as m, '.sql_table('category').' as c, '.sql_table('blog').' as b'.$mtable;
$query .= ' FROM '.sql_table('member').' as m, '.sql_table('category').' as c, '.sql_table('blog').' as b, '.sql_table('item').' as i'.$mtable;
//2010/04/06_takehana_upd_e

ついでに、MySQLの4.x系時代にて文字コードが latin1 になってたせいで検索結果が変になることがあったので、5.x系になった機会にこちらの対応もしました。
まずは既存の latin1 のDBの中身をエクスポートします。そして別途 utf8 のDBを用意してインポートします。これだとDB全体としては utf8 なんですが、テーブル一つ一つは latin1 のままになっているんで、下記SQL文を一個一個実行していって全てのテーブルを utf8 へ変更しました。

ALTER TABLE <テーブル名> CHARSET=utf8;
(例)ALTER TABLE nucleus_item CHARSET=utf8;

ここまでやった後で、Nucleus の config.php を新しいDBへ接続するように書き換えれば完了です。

コメント

タイトルとURLをコピーしました