gpt4 book ai didi

mysql - 如果我更改 MySQL 中列的排序规则,现有数据会发生什么变化?

转载 作者:可可西里 更新时间:2023-11-01 06:36:04 26 4
gpt4 key购买 nike

我正在使用 MySQL 数据库服务器运行生产应用程序。我忘记将列的排序规则从 latin 设置为 utf8_unicode,这导致在保存到包含多语言数据的列时出现奇怪的数据。

我的问题是,如果我现在将排序规则更改为 utf8_unicode,我现有的数据会发生什么情况?它会破坏或损坏现有数据,还是会保留数据,但新数据将按原样保存为 utf8

我将使用 phpMyAdmin 网络客户端进行更改。

最佳答案

文章http://mysqldump.azundris.com/archives/60-Handling-character-sets.html对此进行了详细讨论,并展示了将会发生什么。

请注意,您将字符集(实际上是一种编码)与排序规则混淆了。

字符集定义了字符串在磁盘上的物理表示形式(以字节为单位)。您可以使用 HEX() 函数使其可见,例如 SELECT HEX(str) FROM t WHERE id = 1 以查看 MySQL 如何存储字符串的字节。 MySQL 提供给您的内容可能会有所不同,具体取决于您连接的字符集,使用 SET NAMES .... 定义。

排序规则是一种排序顺序。它取决于字符集。例如,您的数据可能在 latin1 字符集中,但它可能根据两种德语排序顺序 latin1_german1_ci 或 latin1_german2_ci 中的任何一种进行排序。根据您的选择,诸如 ö 之类的变音符号将排序为 oe 或 o。

当您更改字符集时,表中的数据需要重写。 MySQL会读取表中的所有数据和所有索引,对临时占用磁盘空间的表进行隐藏复制,然后将旧表移动到隐藏位置,将隐藏表移动到位,然后删除旧数据,释放磁盘空间。在这期间的一段时间内,您将需要两倍的存储空间。

当您更改排序规则时,数据的排序顺序会发生变化,但数据本身不会发生变化。如果您要更改的列不是索引的一部分,则除了重写 frm 文件之外不需要做任何事情,并且足够新的 MySQL 版本不应该做更多。

当您更改作为索引一部分的列的排序规则时,需要重写索引,因为索引是表的排序摘录。这将再次触发上面概述的 ALTER TABLE 表复制逻辑。

MySQL 试图通过这样做来保存数据:只要您拥有的数据可以用目标字符集表示,转换就不会有损。如果正在进行数据截断,将打印警告,并且目标字符集中无法表示的数据将被替换为 ?

关于mysql - 如果我更改 MySQL 中列的排序规则,现有数据会发生什么变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5575491/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com