虽然他们的数据实际上是希腊语(单字节),但我有几个标记为utf8的表(可能是由于从几年前从另一个服务器导入时出错)。有没有什么办法可以改变表格的编码而不让MySQL尝试转换数据呢?如何在不更改数据的情况下更改表格编码?
编辑以避免更多的误解:数据不是UTF-8。它只是标记为这样。我想更改表的编码以反映数据的实际编码,以便我可以继续将其转换为utf8。
谢谢。
虽然他们的数据实际上是希腊语(单字节),但我有几个标记为utf8的表(可能是由于从几年前从另一个服务器导入时出错)。有没有什么办法可以改变表格的编码而不让MySQL尝试转换数据呢?如何在不更改数据的情况下更改表格编码?
编辑以避免更多的误解:数据不是UTF-8。它只是标记为这样。我想更改表的编码以反映数据的实际编码,以便我可以继续将其转换为utf8。
谢谢。
显然,解决的办法是导出原始数据(SELECT * INTO OUTFILE ...
),使用的iconv命令行从UTF8转换为latin1然后导入回(LOAD DATA INFILE ... CHARACTER SET GREEK
):)
你需要考虑的第一件事是 - 为什么改变工作? UTF-8适用于存储希腊语。
数据库服务器上的空间真的太大了,以至于这么大的改变会节省很多吗?
至于改变编码而不转换数据 - 不,这是不可能的。数据以UTF-8格式存储,需要转换为正确的编码,否则最终会出现一组不可读的列。
更新:
如果数据已经在正确的编码,更改编码无需转换仍可能落得损坏的数据。为什么?由于UTF-8不是单字节字符集,列类型决定了数据库引擎如何存储和访问磁盘上的数据。
我建议尝试 - 在测试表中创建一个UTF-8列,用现有数据填充并转换。如果列类型更改没有转换成功,那么您就很好。
这是一个veeeery旧的文章,但仍然没有正确的答案...
我已经遇到了这个问题,因为我对之前使用过的问题的方法有些不起作用。幸运的是,我发现我的问题不是我的方法,而是工具 - phpMyAdmin。我已经使用MySQL控制台完成了相同的工作,并且完美地工作。
解决方案
如果MySQL认为该数据是在一个字符集(即UTF8),但实际的数据是在其他一些字符集(如latin1的),那么解决方案是将列转换(S )与文本的字符集不知道类型像VARBINARY,BLOB/MEDIUMBLOB ...然后转换回字符集感知柱(一个或多个),同时设置正确的字符集。
如果你有一个MEDIUMTEXT类型列Ÿ表X含LATIN1而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的脚本可以正常工作。 – 2011-02-05 21:22:49