Mysql 如何在不更改数据的情况下更改表编码?

Mysql 如何在不更改数据的情况下更改表编码?,mysql,utf-8,Mysql,Utf 8,我有一些表标记为utf8(可能是由于几年前从另一台服务器导入时出错),尽管它们的数据实际上是希腊语(单字节)。有没有任何方法可以在不让MySQL尝试转换数据的情况下更改表的编码 编辑以避免更多误解:数据不是UTF-8。它只是这样标记。我想更改表的编码,以反映数据的实际编码,这样我就可以继续实际地将它们转换为utf8 谢谢。你需要考虑的第一件事是——为什么要改变工作方式?UTF-8适用于存储希腊语 您真的在数据库服务器上占用了这么多空间,以至于如此剧烈的更改将节省这么多空间吗 至于在不转换数据的

我有一些表标记为utf8(可能是由于几年前从另一台服务器导入时出错),尽管它们的数据实际上是希腊语(单字节)。有没有任何方法可以在不让MySQL尝试转换数据的情况下更改表的编码

编辑以避免更多误解:数据不是UTF-8。它只是这样标记。我想更改表的编码,以反映数据的实际编码,这样我就可以继续实际地将它们转换为utf8


谢谢。

你需要考虑的第一件事是——为什么要改变工作方式?UTF-8适用于存储希腊语

您真的在数据库服务器上占用了这么多空间,以至于如此剧烈的更改将节省这么多空间吗


至于在不转换数据的情况下更改编码-不,这是不可能的。数据存储为UTF-8,需要将其转换为正确的编码,否则您将得到一组无法读取的列


更新:

如果数据已采用正确的编码,则在不转换的情况下更改编码仍可能导致数据损坏。为什么?因为UTF-8不是单字节字符集,列类型决定数据库引擎如何存储和访问磁盘上的数据


我建议进行实验——在测试表中创建一个UTF-8列,用现有数据填充它并转换。如果列类型更改成功而不进行转换,您就可以继续了。

显然,解决方案是将原始数据导出(
SELECT*到OUTFILE…
),从命令行使用iconv将utf8转换为latin1,然后重新导入(
LOAD data infle…CHARACTER SET green
):)

这是一篇非常古老的文章,但是仍然没有正确的答案

我提出这个问题是因为我之前使用的解决问题的方法有点不起作用。幸运的是,我发现我的问题不是我的方法,而是工具phpMyAdmin。我使用MySQL控制台也做了同样的工作,它工作得非常好

解决方案

如果mysql认为数据在一个字符集(即utf8)中,但实际数据在另一个字符集(即latin1)中,那么解决方案是将包含文本的列转换为不知道字符集的类型,如VARBINARY、BLOB/MEDIUMBLOB。。。然后在设置正确的字符集时转换回支持字符集的列

如果您在表x中有一个MEDIUMTEXT类型的列y,其中包含拉丁文1格式的数据,而mysql认为它位于其他字符集(在您的例子中为utf8),请使用以下恢复指令:

mysql> ALTER TABLE `x` CHANGE `y` `y` MEDIUMBLOB;
mysql> ALTER TABLE `x` CHANGE `y` `y` MEDIUMTEXT CHARACTER SET latin1 COLLATE latin1_general_ci;

当然,您必须确保MySQL实例支持该字符集。

不,您不明白。数据不是utf8。它只是这样标记的。我想更改编码以反映数据的实际编码,以便我编写的将其转换为utf8的脚本能够正常工作。@Lea-只是为了确认我的理解。存储在UTF-8列中的数据不是UTF-8。当前读取时,您需要在查看之前将其转换为正确的编码?如果我使用utf8:)连接到mysql,它们实际上是无法读取的。它们的数据与其他表中的latin1数据的工作方式完全相同。@Lea-Answer已更新。简言之,你需要做一点实验。无论如何,我认为更改类型最终会导致数据损坏。