我正在使用MySQL数据库服务器运行生产应用程序。我忘记将列的排序规则从latin
设置为utf8_unicode
,这会导致在保存到包含多语言数据的列时出现奇怪的数据。
我的问题是,如果我现在将排序规则更改为utf8_unicode,我的现有数据会发生什么?它会破坏或损坏现有数据,还是会保留数据,但新数据将按应该的方式保存为utf8
?
我将使用phpMyAdmin web client进行更改。
发布于 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尝试这样做来保留数据:只要您拥有的数据可以用目标字符集表示,转换就不会有损失。如果正在进行数据截断,将打印警告,并且无法在目标字符集中表示的数据将被替换为?
https://stackoverflow.com/questions/5575491
复制相似问题