更改 MySQL db 的 character_set 和 collat​​ion 时是不是会影响现有索引

Posted

技术标签:

【中文标题】更改 MySQL db 的 character_set 和 collat​​ion 时是不是会影响现有索引【英文标题】:Will existing indexes be affected when changing character_set and collation of MySQL db更改 MySQL db 的 character_set 和 collat​​ion 时是否会影响现有索引 【发布时间】:2020-04-27 02:55:37 【问题描述】:
    我们有一个数据库,其中表和列的默认字符集设置为 utf8 编码 但是使用 utf8 的字符集编码,我们无法保存表情符号 为了支持表情符号的保存, a) 我们必须将表和列的字符集更改为 utf8mb4 b) 我们必须将表和列的排序规则更改为 utf8mb4_unicode_ci c) 更新我们的 JDBC 驱动,使其支持 unicode 编码

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

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

【问题讨论】:

【参考方案1】:

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

你应该做一个或另一个

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

转换表格中的所有文本列。或者,如果您需要保留一些当前字符集/排序规则,则更改每一列:

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 将其视为一种改变,因此没有采取任何捷径。

【讨论】:

以上是关于更改 MySQL db 的 character_set 和 collat​​ion 时是不是会影响现有索引的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Java 和 DB 时区会自动更改?

更改 MySQL db 的 character_set 和 collat​​ion 时是不是会影响现有索引

MySQL字符集与排序规则 北京MySQL DBA学习

Laravel 中的动态数据库更改

MySQL 用户 DB 没有密码列 - 在 OSX 上安装 MySQL

如何修改mysql数据文件存储位置