首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果我在MySQL中更改列的排序规则,会对现有数据产生什么影响?

如果我在MySQL中更改列的排序规则,会对现有数据产生什么影响?
EN

Stack Overflow用户
提问于 2011-04-07 11:08:44
回答 5查看 8.4K关注 0票数 9

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

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

我将使用phpMyAdmin web client进行更改。

EN

Stack Overflow用户

发布于 2011-04-07 19:24:23

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

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

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

排序规则是一种排序顺序。它依赖于字符集。例如,您的数据可能采用latin1字符集,但可能会根据两种德语排序顺序latin1_german1_ci或latin1_german2_ci中的任意一种进行排序。根据您的选择,诸如ö之类的Umlauts将排序为oe或o。

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

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

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

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

票数 7
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5575491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档