我的数据库中的所有表和列都使用 utf8mb4 字符集和 utf8mb4_unicode_ci 排序规则。我想迁移到 utf8mb4_0900_ai_ci 排序规则,但convert to
在我的大型表中使用 utf8mb4_0900_ai_ci 排序规则是不允许的,除非我使用 gh-ost 或 pt-osc。
我觉得这convert to
应该没有必要,因为字符集没有变化,但我找不到任何文档来证实或否认这一点。convert to
在这种情况下我需要使用吗?还是就alter table ... modify col ... collate ...
足够了?
我查看了“使用转换为字符集来仅更改排序规则?”这个问题,它提出了一个非常类似的问题,但由于这个问题的年代久远,答案有些过时了。即便如此,一个答案似乎暗示这convert to
是不必要的。另一个答案深入探讨了字符集转换以及如何使用 pt-osc,而我希望避免这种情况。
字符集没有改变,但排序规则的改变可能会改变字符的排序顺序,这需要重建索引。
如果具有排序规则的列上有索引,则不允许就地更改(在 MySQL 8.4.4 上测试):
如果某列有索引,那么您也不能改变该列的排序规则。
但是如果你删除索引(这可以作为就地操作完成),那么你可以改变排序规则,也可以作为就地操作完成。
更改排序规则后,您可以重新创建索引,同样不需要表副本:
MySQL 应该能够帮你自动完成这三个步骤吗?也许吧。你可以试试搜索https://bugs.mysql.com,看看是否有人请求过这个功能,如果有的话,MySQL 开发者的反馈如何。
如果表包含多行数据,创建索引确实需要时间。这是一种就地修改,因为它不需要复制表,并且允许并发 DML,但存在一些限制。更多详情,请参阅https://dev.mysql.com/doc/refman/8.4/en/innodb-online-ddl-operations.html 。
我还没有测试过主键是带排序规则的字符串列的情况,但我认为这行不通。在 InnoDB 中,您无法“删除”聚集索引,因为聚集索引就是表本身。
就我个人而言,我会直接使用 pt-online-schema-change 来进行此类修改。在我上一份工作中,我们每周在生产时间使用 pt-osc 数百次,而且没有中断流量,即使是在超大表(我们定义为 500GB 或更大)的情况下也是如此。
由于您只更改了排序规则,因此无需进行转换。您没有更改字符集。
这就是该命令存在的原因。