#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でいいかも。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS