为什么表CHARSET设置为utf8mb4和COLLATION到utf8mb4_unicode_520_ci

问题描述:

我最近注意到,当我开始一个新的WordPress项目时,我的表的排序自动从utf8_unicode_ci(我从PhpMyAdmin创建新数据库时选择)到utf8mb4_unicode_520_ci。为什么表CHARSET设置为utf8mb4和COLLATION到utf8mb4_unicode_520_ci

此外,我已经注意到在常规设置下的PhpMyAdmin中,服务器连接排序规则默认为utf8mb4_unicode_520_ci。

我在Ubuntu 17.04上运行MySQL Server 5.7.17和PhpMyAdmin 4.6.6。

我的问题是以下几点:

  1. 这究竟是为什么?
  2. 如果可能,我该如何防止这种情况发生?由于utf8mb4,我在将WP网站迁移到不支持它的旧MySQL服务器时遇到了问题。
  3. 第2点是可取的吗?通过utf8使用字符集utf8mb4和通过utf8_unicode_ci整理utf8mb4_unicode_520_ci有没有什么好处?

过去只有utf8;将来,utf8mb4将成为默认字符集。

过去,_general_ci是默认排序规则;那么_unicode_ci(Unicode 4.0)更好,然后_unicode_520_ci(Unicode 5.20)。在将来(MySQL 8.0),默认值将是_0900_ci_ai(Unicode 9.0)。

与此同时,这条道路充满了MySQL过去的错误所产生的坑洞。而WP设计师正在驾驶一辆没有注意到坑洼的大坦克。

MySQL 5.6是一个很大的坑洞,吞并了许多WP用户,因为索引的长度限制为767,WP过长的VARCHAR(255)以及使用utf8mb4的可能性。你有5.7.17的好处。 (你未来搬到8.0将不会太颠簸。)

也就是说,5.7.7+上新创建的数据库/表/列不应该遇到767问题,但是从旧版本(5.5.3+)可能有问题,特别是如果某些原因导致您更改为utf8mb4。

怎么办?我可能会用尽空间来拼出所有选项。所以提供的历史数据,升级路径(如果有的话),当前的设置,表的ROW_FORMAT,列的CHARACTER SETCOLLATIONSHOW VARIABLES LIKE 'char%';

输出,你应该在哪里?只要可行,只要5.7.7+,utf8mb4utf8mb4_unicode_520_ci。该charset给你表情符号和所有的中文(UTF8不)。这种整理是最好的,尽管你可能很难注意到它的重要性。

注意:排序规则名称的第一部分是唯一与其配合使用的字符集。那是utf8_unicode_ci不适用于utf8mb4

+0

很好的答案,谢谢瑞克。我唯一的问题是迁移到较旧的MySQL服务器。因此,仅供将来参考,如果可能,尝试升级MySQL服务器是一个更好的主意,而不是将CHARSET和COLLATION转换回Unicode 4.0。再次感谢。 –

+0

@ТомицаКораћ - 感谢我的自负。是的,前进,而不是后退。 –

+0

@RickJames何时会发布下一个主要的整理版本支持(例如'0900_ci_ai'),我们可以在哪里开发它?在谷歌上引用它会产生零结果。 – John