2011-02-05 73 views
2

虽然他们的数据实际上是希腊语(单字节),但我有几个标记为utf8的表(可能是由于从几年前从另一个服务器导入时出错)。有没有什么办法可以改变表格的编码而不让MySQL尝试转换数据呢?如何在不更改数据的情况下更改表格编码?

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

谢谢。

回答

1

显然,解决的办法是导出原始数据(SELECT * INTO OUTFILE ...),使用的iconv命令行从UTF8转换为latin1然后导入回(LOAD DATA INFILE ... CHARACTER SET GREEK):)

3

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

数据库服务器上的空间真的太大了,以至于这么大的改变会节省很多吗?


至于改变编码而不转换数据 - 不,这是不可能的。数据以UTF-8格式存储,需要转换为正确的编码,否则最终会出现一组不可读的列。


更新:

如果数据已经在正确的编码,更改编码无需转换仍可能落得损坏的数据。为什么?由于UTF-8不是单字节字符集,列类型决定了数据库引擎如何存储和访问磁盘上的数据。

我建议尝试 - 在测试表中创建一个UTF-8列,用现有数据填充并转换。如果列类型更改没有转换成功,那么您就很好。

+0

不,你不明白。 **数据不是utf8 **。它只是标记为这样。我想更改编码以反映数据的实际编码,以便我编写的将它们转换为utf8的脚本可以正常工作。 – 2011-02-05 21:22:49

0

这是一个veeeery旧的文章,但仍然没有正确的答案...

我已经遇到了这个问题,因为我对之前使用过的问题的方法有些不起作用。幸运的是,我发现我的问题不是我的方法,而是工具 - phpMyAdmin。我已经使用MySQL控制台完成了相同的工作,并且完美地工作。

解决方案

如果MySQL认为该数据是在一个字符集(即UTF8),但实际的数据是在其他一些字符集(如latin1的),那么解决方案是将列转换(S )与文本的字符集不知道类型像VARBINARYBLOB/MEDIUMBLOB ...然后转换回字符集感知柱(一个或多个),同时设置正确的字符集。

如果你有一个MEDIUMTEXT类型列ŸXLATIN1而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的实例支持。

相关问题