EC-CUBE:2.13.3をインストールしたところ、下記のようなエラーが発生しました。
Fatal error: DB処理でエラーが発生しました。Error ‘Unknown table engine ‘InnoDB’ SQL: [SET SESSION storage_engine = InnoDB]
グッグるで調べたら、いくつの解決策がありますが、それでこちらの問題を解決してなかったので、自力で調査&対応しました。
0.前提
システム要件は下記の通りです。今回エラーを発生させた要件はEC-CUBEバージョンとDBバージョンと思います。
・EC-CUBEバージョン:2.13.3
・PHPバージョン:PHP 5.3.29
・DBバージョン:MySQL 5.0.77
1.直ぐにエラーの発生場所を見つけた
「eccube\class\db\dbfactory\SC_DB_DBFactory_MYSQL.php」ファイルの363行辺り、SC_Queryでの初期化時に下記の実装がありました。
1 2 3 4 5 6 |
$objQuery->exec('SET SESSION storage_engine = InnoDB'); $objQuery->exec("SET SESSION sql_mode = 'ANSI'"); |
MySQL 5.0はstorage_engineのInnoDBをサポートしているのに、前述のエラーが発生したのは不思議ですね。レンタルサーバーのDB環境の設定を確認したところ、storage_engineにInnoDBがない!!!!MyISAMがありますので、下記の実装を修正しました。
1 2 3 4 5 6 |
$objQuery->exec('SET SESSION storage_engine = MyISAM'); $objQuery->exec("SET SESSION sql_mode = 'STRICT_TRANS_TABLES'"); |
2.またエラーが発生した
万歳!解決!と思いきや、進むボタンを押したら、またエラーが発生しました。しかも今度はエラーメッセージがない!!どうしよう~~誰かが助けて~~~
誰でも返事してくれなかったので、自力で解決しました。
「eccube\install\index.php」ファイルの868行辺りに、上記と同じような実装がありました。それを上記と同じように修正すれば、直るはずと信じていました。
1 2 3 4 5 6 |
$objQuery->exec('SET SESSION storage_engine = MyISAM'); $objQuery->exec("SET SESSION sql_mode = 'STRICT_TRANS_TABLES'"); |
3.またエラーが発生した(2回目)
今度こそ、解決!!シャンパンを開けた瞬間に、体が固まった。またエラーが発生!!クソ!!!
画面上に意味ないエラーメッセージ[Error message: Could not execute statement] が表示されましたので、こんな時に、エラーログの登場です。
「eccube\html\install\temp」の下に、インストールログ(install.log)を開き、一番下に下記のエラーメッセージが出力しました。
Specified key was too long; max key length is 1000 bytes
引かれた場所は、dtb_index_listテーブルのPKを作成した際に、PRIMARY KEY (table_name(255), column_name(255))のところです。
調べたら、MySQLのstorage_engineがMyISAMの場合、インデックスの長さは1000バイトだそうです。
dtb_index_listテーブルは、table_name(255)とcolumn_name(255)の複合キーで、両方ともtext(Varchart)なので、(255 + 255) X 3 = 1530bytesで計算したら、軽く1000bytesの制限を超えますよね。
普通にテーブル名やカラム名は英字で定義されるなので、450bytes十分ではないかと思って、適当に150に変更しました。
「eccube\html\install\sql\create_table_mysql.sql」ファイルの1172行辺り、下記のように修正して、進むボタンを押したら。。。万歳!無事にインストール成功しました!
1 2 3 4 5 |
PRIMARY KEY (table_name(150), column_name(150)) |
4.最後に
本当に解決したかと疑って、商品検索/登録/削除、会員登録、商品購入完了を動作確認したところ、特に問題なかった!!
ソースを改修せずに、問題を解決したほうが良いと思いますが、今回の原因は誰の責任だろうと思って、eccube2.13系の要件を確認したところ、InnoDBを明記してなかったです。タダなので、まあいいや。