Illegal mix of collationsエラーが出ないようにする

MySQLにSELECT文を発行したら、以下のようなエラーが出て失敗した。

Illegal mix of collations (ujis_japanese_ci,IMPLICIT) and
(latin1_swedish_ci,COERCIBLE) for operation '='

ujisのテーブルにlatin1で検索条件指定しても駄目だよ、というエラーのようだ。実際にはSQLEUCで書いているのだが、MySQLは設定によってこちらの文字コードをlatin1だと信じ込んでいるらしい。my.cnfかmysqldの起動パラメータで設定変更してやるか、テーブルに接続後に毎回SQLで設定を変更してやる必要がある。今回は最終的にレンタルサーバーで稼動させるつもりなので、毎回SQLで設定してやる方法を取る。

"SET NAMES ujis"
というSQLを発行してやれば、その接続では以後こちらのリクエストをEUCだと判断してくれるようになる。これを接続後毎回実行させるために、Ethna_DB_ADOdbを継承したクラスを作ってconnectメソッドをオーバーライドした。

<?php
require_once('Ethna/class/DB/Ethna_DB_ADOdb.php');

class PROJECTID_DB_ADOdb extends Ethna_DB_ADOdb
{
    /**
     * オーバーライド
     * 通常の接続処理の後、MySQLの文字コードを設定するSQLを発行する
     *
     */
    function connect() {
        if (!parent::connect()) {
            return false;
        }

        return $this->query('SET NAMES ujis');
    }
}
?>

そして、こちらのクラスをDBクラスとして使うようにControllerに設定。

136行目付近で

  • 'db' => 'Ethna_DB_ADOdb',
  1. 'db' => 'PROJECTID_DB_ADOdb',