我有一些标记为utf8的表(可能是由于几年前从另一台服务器导入时出错),尽管它们的数据实际上是希腊语(单字节)。有没有办法我可以改变表的编码而不让MySQL尝试转换数据呢?
编辑以避免更多误解:数据不是UTF-8。它只是标记为这样。我想更改表的编码以反映数据的实际编码,以便我可以继续将它们实际转换为utf8。
感谢。
答案 0 :(得分:3)
你需要考虑的第一件事是 - 为什么要改变有效的方法? UTF-8适合存储希腊语。
你真的在数据库服务器上空间太多,这么大的改变会节省那么多吗?
至于在不转换数据的情况下更改编码 - 不,这是不可能的。数据存储为UTF-8,需要转换为正确的编码,否则最终会出现一组不可读的列。
更新
如果数据已经采用正确的编码,则更改编码而不进行转换可能仍会导致数据损坏。为什么?因为UTF-8不是单字节字符集,而列类型决定了数据库引擎如何存储和访问磁盘上的数据。
我建议尝试 - 在测试表中创建一个UTF-8列,用现有数据填充并转换。如果列类型更改成功而没有转换,则可以继续。
答案 1 :(得分:1)
显然解决方案是导出原始数据(SELECT * INTO OUTFILE ...
),使用命令行中的iconv将utf8转换为latin1,然后导回(LOAD DATA INFILE ... CHARACTER SET GREEK
):)
答案 2 :(得分:0)
这是一篇很老的帖子,但仍然没有正确答案......
我已经触及了这个问题,因为我之前使用过的问题的方法有点不起作用。幸运的是,我发现我的问题不是我的方法,而是工具 - phpMyAdmin。我使用MySQL控制台完成了同样的工作,它完美无缺。
解决方案
如果mysql认为数据在一个字符集(即utf8)中,但实际数据在某些其他字符集中(即latin1),那么解决方案是将带有文本的列转换为字符集不知道类型比如 VARBINARY , BLOB / MEDIUMBLOB ...然后在设置正确的字符集时转换回字符集识别列。
如果在 latin1 中包含数据的表 x 中有 MEDIUMTEXT 类型列 y ,而mysql思考它是在其他一些charset(在你的情况下是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实例支持charset。