关于mysql:如何更改数据库的默认排序规则?

How to change the default collation of a database?

我们以前的程序员在一个表(mysql)中设置了错误的排序规则。他用拉丁语排序法设置了它,当时应该是utf8,现在我有问题了。每一张中日文字的唱片都变成了????性格。

是否可以更改排序规则并返回字符的详细信息?


更改数据库排序规则:

ZZU1

更改表排序规则:

ZZU1

更改列排序规则:

ZZU1

更多信息:

  • utf8-general和utf8-unicode有什么区别?
  • utf8-general和utf8-unicode有什么区别
  • 如何更改数据库、表、列的排序规则?


下面介绍如何更改所有数据库/表/列。运行这些查询,它们将输出将整个方案转换为UTF8所需的所有后续查询。希望这有帮助!

--更改数据库默认排序规则

ZZU1

--更改表排序规则/字符集

ZZU1—4

--更改列排序规则/字符集

ZZU1


注意,在MySQL中,EDOCX1字符集只是真正的utf8字符集的一个子集。为了节省一个字节的存储空间,MySQL团队决定只存储三个字节的utf8字符,而不是完整的四个字节。这意味着一些东亚语言和emoji并没有得到充分的支持。为了确保可以存储所有的utf8字符,请在MySQL中使用EDOCX1-1数据类型和EDOCX1-2或EDOCX1-3。


除了DavidWhittaker发布的内容之外,我还创建了一个查询,生成了完整的表和列alter语句,这些语句将转换每个表。跑步也许是个好主意

设置会话组concat max=100000;

首先要确保你的团队海螺不会超过这里看到的非常小的限制。

ZZU1

上一个答案的区别在于,它使用的是utf8而不是ut8mb4,使用的是T1.data类型和T1.character(按最大长度计算)对枚举无效。所以,我的查询排除了视图,因为这些视图必须单独修改。

我只是使用Perl脚本以数组的形式返回所有这些更改,并对它们进行迭代,修复了太长的列(通常它们是varchar(256),而数据中通常只有20个字符,所以这是一个简单的修复)。

我发现从Latin1->utf8mb4更改时有些数据已损坏。它似乎是utf8编码的拉丁字符,列中的1字符在转换过程中会出错。我只是简单地保存了来自列的数据,我知道这些列在修改前后会成为内存中的一个问题,并对它们进行比较,生成更新语句来修复数据。


这里很好地描述了这个过程。然而,一些不适合拉丁语的字符却永远消失了。utf-8是拉丁语1的超集。不是反过来。大多数将适合单字节空间,但任何未定义的将不适合(检查Latin1列表-并非所有256个字符都已定义,这取决于MySQL的Latin1定义)