#author("2020-10-07T05:34:38+00:00","default:src128","src128") #author("2020-10-07T05:42:47+00:00","default:src128","src128") &tag(MySQL8/utf8mb4); *目次 [#qf3707c3] #contents *関連ページ [#y545ac6f] *参考情報 [#y0d169c2] *概要 [#y526eacf] -絵文字などを保存できるutf8mb4を使用したい。 -しかしutf8mb4のデフォルトのcollate(照合順)はutf8mb4_0900_ai_ci。大文字や小文字を区別しない。 -utf8mb4_binが使いたいのだが、これを指定するとカラム毎のcharsetや、collateが追加されてしまう(mysqldumpやshow create tableなどで)。 -現状はこれは我慢するしかないのか?(MySQL 8.0.21)。 *挙動のテスト [#ya3cb301] -/etc/my.cnfは以下。これでデフォルトのcharsetはutf8mb4、collateはutf8mb4_binとなる。 collation-server=utf8mb4_bin -testdbデータベースの生成。 create database testdb default charset=utf8mb4 collate=utf8mb4_bin -test_tableテーブルの生成。 #pre{{ DROP TABLE IF EXISTS test_table; create table test_table( title varchar(255) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; }} -テーブル確認。title列にcollateが指定されている。 #pre{{ mysql> show create table test_table; +------------+-------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +------------+-------------------------------------------------------------------------------------------------------------------------------------------------+ | test_table | CREATE TABLE `test_table` ( `title` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin | +------------+-------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) }} -mysqldumpした場合も。上記create分が追加される。しかしそのdumpをimportすると以下のような定義となる。 #pre{{ mysql> show create table test_table; +------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | test_table | CREATE TABLE `test_table` ( `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin | +------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) }} -すなわち最終的に文字列型の列にcharsetとcollateが伝搬してしまっていることがわかる。 -railsのschema.rbが変更されてしまう可能性がありかなりうっとうしい挙動。 ※collateがデフォルトのままだとこのような挙動は発生しないが、utf8mb4_binを使う以上はさけられないのか? **結論 [#b6040e0e] -collateがデフォルトのままだとこのような挙動は発生しないが、utf8mb4_binを使う以上はさけられないのか? -utf8mb4_bin使うと定義がごちゃごちゃするし、2020/10/07(水)まで特に気にせずデフォルトのutf8mb4_0900_ai_ciで問題なく使っていたので、utf8mb4_0900_ai_ciでいいかも。