loading...

MySQL(InnoDB) で charset を utf8mb4 にする注意点の現在

seizans profile image Seizan Shimazaki ・1 min read

絵文字に対応したいなどの理由で utf8mb4 を使う。
ただ、utf8mb4 に設定するだけだと以前は問題があった。
MySQL 5.7.9 以降では解決されたので、その話をまとめる。

charset を utf8mb4 にする

server 全体に設定するでよければ my.cnf に次を設定すればよい。

[mysqld]
character_set_server=utf8mb4
collation_server=utf8mb4_unicode_ci

database 単位で設定したければ、次を発行すればいい。

ALTER DATABASE spam CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

対応すべき問題

utf8mb4 に変えると、VARCHAR 等のカラムで、同じ文字数でも size が大きくなる。
デフォルトではこの size の上限は 767byte で、index を張ろうとして落ちるなどする。
ということが、MySQL(InnoDB) で "Index column size too large. The maximum column size is 767 bytes." いわれるときの対策、で詳しく説明されている。

以前の解決方法

innodb_large_prefix パラメータを ON にすることで、size 上限が 3072byte になり、問題なくなる。
ただしそのためには、テーブルの ROW_FORMAT を DYNAMIC (か COMPRESSED) にする必要がある。
さらにそのためには、innodb_file_format が Barracuda であることが必要。

なので実際には

innodb_large_prefix=ON
innodb_file_format=Barracuda
innodb_file_format_max=Barracuda

として、また CREATE TABLE するときに ROW_FORMAT=DYNAMIC を付けることで解決できた。

現在

  • innodb_file_format はデフォルトで Barracuda (5.7.7 以降)、
  • innodb_default_row_format はデフォルトで DYNAMIC (5.7.9 以降)
  • innodb_large_prefix はデフォルトで ON (5.7.7 以降)で、deprecated で、じき項目が消える予定

ということで、上記の問題を解決するために設定すべき項目は 5.7.9 以降では無くなり、解決していた。

参照

Discussion

markdown guide