Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果我在MySQL中更改列的排序规则,现有数据会发生什么变化?_Mysql_Phpmyadmin_Collation - Fatal编程技术网

如果我在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我插入了一些非拉丁字符

我正在使用MySQL数据库服务器运行一个生产应用程序。我忘了将列的排序规则从
拉丁语设置为
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...