絵文字に対応したいなどの理由で 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 以降では無くなり、解決していた。
参照
- https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_file_format
- https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_default_row_format
- https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_large_prefix
- https://dev.mysql.com/doc/refman/5.7/en/innodb-restrictions.html
- https://dev.mysql.com/doc/refman/5.7/en/innodb-row-format-specification.html
- https://dev.mysql.com/doc/refman/5.7/en/innodb-row-format-dynamic.html
Top comments (0)