如果我在MySQL中更改列的排序规则,现有数据会发生什么变化?
我正在使用MySQL数据库服务器运行一个生产应用程序。我忘了将列的排序规则从如果我在MySQL中更改列的排序规则,现有数据会发生什么变化?,mysql,phpmyadmin,collation,Mysql,Phpmyadmin,Collation,我正在使用MySQL数据库服务器运行一个生产应用程序。我忘了将列的排序规则从拉丁语设置为utf8\u unicode,这会导致在保存到包含多语言数据的列时出现奇怪的数据 我的问题是,如果我现在将排序规则更改为utf8\U unicode,现有数据会发生什么情况?它会破坏或损坏现有数据还是会保留数据,但新数据会按其应有的方式保存为utf8 我将使用phpMyAdmin web客户端进行更改。在MySQL 5.1中运行快速测试,将VARCHAR列设置为latin1\u bin我插入了一些非拉丁字符
拉丁语设置为utf8\u unicode
,这会导致在保存到包含多语言数据的列时出现奇怪的数据
我的问题是,如果我现在将排序规则更改为utf8\U unicode,现有数据会发生什么情况?它会破坏或损坏现有数据还是会保留数据,但新数据会按其应有的方式保存为utf8
我将使用phpMyAdmin web客户端进行更改。在MySQL 5.1中运行快速测试,将VARCHAR列设置为latin1\u bin
我插入了一些非拉丁字符
INSERT INTO Test VALUES ('英國華僑');
我选择了它们,得到了垃圾(正如预期的那样)
给予
然后,我将列的排序规则更改为utf8\u unicode
,并重新运行SELECT,它显示了相同的结果
text
????
这就是我所期望的——它将保留数据,而数据将仍然是垃圾,因为当插入数据时,列丢失了额外的字符信息,而只是插入了一个?对于每一个非拉丁字符,没有办法使用????再次成为英國華僑.
您的数据将保持不变,但不会被修复。有效数据将被正确转换:
使用更改数据类型时
更改或修改,MySQL尝试
将现有列值转换为
新的类型以及可能的。警告:
此转换可能导致
更改数据
。。。更具体地说:
转换二进制或非二进制
字符串列以使用特定的
字符集,使用ALTER TABLE。对于
要成功转换,请执行以下操作之一:
必须满足以下条件:
应用:[……]如果列具有
非二进制数据类型(CHAR、VARCHAR、,
文本),其内容应进行编码
在列字符集中,不是一些
其他字符集。如果内容
用不同的字符编码
设置时,可以将列转换为使用
首先是二进制数据类型,然后是
具有所需字符串的非二进制列
字符集
因此,您的问题是无效数据,例如,编码在不同字符集中的数据。我尝试了文档中建议的技巧,它基本上破坏了我的数据,但原因是我的数据已经丢失了:运行选择列,表中的十六进制(column)
显示多字节字符已插入为0x3F
(即拉丁文中的?
符号)。我的MySQL堆栈非常聪明,可以检测到输入数据不是Latin1,并将其转换为“兼容”的内容。一旦数据消失,你就无法找回它
总而言之:
使用HEX()确定您是否仍有数据
在表的副本中进行测试
本文详细讨论了这一点,并展示了将会发生什么
请注意,您将字符集(实际上是编码)与排序规则混合在一起
字符集定义磁盘上以字节为单位的字符串的物理表示形式。您可以使用HEX()函数使其可见,例如从t中选择HEX(str),其中id=1
查看MySQL如何存储字符串的字节。MySQL提供给您的内容可能会有所不同,具体取决于连接的字符集,这些字符集由集合名称定义。
排序规则是一种排序顺序。它取决于角色集。例如,您的数据可能是拉丁1字符集,但它可能根据两种德语排序顺序拉丁1\u german1\u ci或拉丁1\u german2\u ci进行排序。根据您的选择,像ö这样的Umlauts将被归类为oe或o
更改字符集时,需要重写表中的数据。MySQL将读取表中的所有数据和所有索引,制作临时占用磁盘空间的表的隐藏副本,然后将旧表移动到隐藏位置,将隐藏表移动到位,然后删除旧数据,释放磁盘空间。在两者之间的一段时间内,您将需要两倍的存储空间
更改排序规则时,数据的排序顺序会更改,但数据本身不会更改。如果您正在更改的列不是索引的一部分,那么除了重写frm文件之外,不需要做任何事情,而且足够新的MySQL版本不应该做更多的事情
更改作为索引一部分的列的排序规则时,需要重写索引,因为索引是表的排序摘录。这将再次触发上述ALTER TABLE copy逻辑
MySQL试图这样保存数据:只要您拥有的数据可以在目标字符集中表示,转换就不会有损失。如果正在进行数据截断,将打印警告,并且无法在目标字符集中表示的数据将替换为
我的问题是,如果我更改我的
现在是utf8\U unicode的排序规则吗
答:如果您更改为utf8_unicode_ci,则现有数据将不会发生任何更改(该数据已损坏,在您修改之前将一直损坏)
它会破坏或损坏现有数据还是会保留数据,
但是新的数据会像应该的那样保存为utf8吗
答:更改为utf8_unicode_ci后,现有数据不会被销毁。它将保持与以前一样(类似于??)。但是,如果插入包含Unicode字符的新数据,它将被正确存储
我将使用phpMyAdmin web客户端进行更改
答:当然,您可以通过进入操作>表选项来使用phpMyAdmin更改排序规则!一些问题通过网络解决
ALTER TABLE ... CONVERT TO ...
有些问题通过两步过程解决
ALTER TABLE ... MODIFY ... VARBINARY...
ALTER TABLE ... MODIFY ... VARCHAR...
如果你做错了,你会有更糟的局面
执行选择十六进制(col),col…
查看您真正拥有的内容
螺柱
ALTER TABLE ... CONVERT TO ...
ALTER TABLE ... MODIFY ... VARBINARY...
ALTER TABLE ... MODIFY ... VARCHAR...