CREATE TABLE sub ( id int(10) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY, msg varchar(200) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE mrg ( id int(10) unsigned NOT NULL AUTO_INCREMENT KEY, msg varchar(200) ) ENGINE=MERGE UNION=(sub);
こういうマージテーブルを作って、マージテーブルにアクセスすると、
ERROR 1168 (HY000): Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist
こんなエラーが出る。が、しかし、
CREATE TABLE sub ( id int(10) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY ) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE mrg ( id int(10) unsigned NOT NULL AUTO_INCREMENT KEY ) ENGINE=MERGE UNION=(sub);
や、
CREATE TABLE sub ( id int(10) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY, msg text ) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE mrg ( id int(10) unsigned NOT NULL AUTO_INCREMENT KEY, msg text ) ENGINE=MERGE UNION=(sub);
ではエラーにならない。
なにが起こっているかというと、上記例では全てマージ側のテーブルにDEFAULT CHARSETの指定が無く、マージ元テーブルと文字コードが違ってしまい、その影響でマージ元と先で違うテーブルだと判断されているみたい。
Oracleと違ってMySQLのCHAR型は文字数単位のため、内部的な容量の取り方が違うからなんだろうと思われる。なので、試してないけどデフォルトがUTF-8な環境では普通にアクセスできると思う。
世のサンプルは英語ばかりなので、けっこうハマった。