tanamonの稀に良く書く日記

KEEP CALM AND DRINK BEER

マージテーブルにアクセスすると1168エラーが出る件

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な環境では普通にアクセスできると思う。


世のサンプルは英語ばかりなので、けっこうハマった。