更改 character_set 和 MySQL db 的排序规则时,现有索引是否会受到影响

Will existing indexes be affected when changing character_set and collation of MySQL db

  1. 我们有一个数据库,其中 table 和列的默认字符集设置为 utf8 编码
  2. 但是使用 utf8 字符集编码,我们无法保存表情符号
  3. 支持保存表情符号, a) 我们必须将 table 和列的字符集更改为 utf8mb4 b) 我们必须将 table 和列的排序规则更改为 utf8mb4_unicode_ci c) 更新我们的 JDBC 驱动程序,使其支持 unicode 编码

通过上述更改,我们可以将表情符号保存在我们的列中。

问题: 1) 我是否需要删除现有索引(varchar 列)并重新创建索引,因为之前使用 utf8 每个字符占用 3 个字节,而现在使用 utf8mb4 编码它将占用 4 个字节?

索引是指向 table 行的有序指针列表。排序基于索引列的 CHARACTER SETCOLLATION。如果您更改其中任何一个,则必须重建索引。 "pointer"(在此上下文中)是 PRIMARY KEY.

的副本

你应该做其中之一

ALTER TABLE tbl CONVERT TO CHARACTER SET utf8mb4 COLLATE ...,;

转换 table 中的所有文本列。或者,如果您需要保留一些当前的 charset/collation,则更改每一列:

ALTER TABLE tbl MODIFY col_name ... CHARACTER SET utf8mb4 COLLATE ...;

其中第一个“...”是列定义的其余部分(VARCHAR、NOT NULL,等等)。

任何涉及正在更改的列的索引都将被重建。特别要注意,VARCHAR PRIMARY KEY 在每个二级索引中有效。

排序规则utf8mb4_unicode_ci比较旧;您可能更喜欢 utf8mb4_unicode_520_ci,尤其是因为它将表情符号处理为不同的而不是集中在一起 (IIRC)。

utf8 是 utf8mb4 的子集这一事实无关紧要; MySQL 将其视为一种改变,不会采取任何捷径。