如何将mysql的Latin1转换为UTF8

15

我继承了一个需要进一步开发的网络系统。 这个系统似乎是由一个只看了两章PHP教程就认为自己能编码的人创建的...

所以...网页本身采用UTF8编码,所有内容的展示和输入都是在其中。数据库表已经使用UTF8字符集创建。但是,在配置中却有"SET NAMES LATIN1"。换句话说,UTF8编码的字符串被强制转换为Latin1编码并填充到数据库中。

有没有办法将这个混乱转换成真正存储为utf8并消除latin1?

我尝试过这个,但由于数据库表设置为utf8,所以无法工作。也尝试过这个,但不成功。

如果可能的话,我也许可以通过在PHP中使用latin1编码读取所有表,然后将它们写回一个新的utf8数据库来完成此操作,但我想避免这样做。

3个回答

28

我通过对文本字段进行更新来解决了它:

UPDATE table SET title = CONVERT(CONVERT(CONVERT(title USING latin1) USING binary) USING UTF8)

2
我在我的数据库中尝试了这个,但它会在第一个umlaut或特殊字符的位置处截断每个字符串。有什么正确的方法吗? - kriegaex
如果您的字段中的表格有正确的UTF8条目混合,则会在这些列上失败,并获得1300错误“无效的utf8字符字符串”。您可以逐行更新并跳过抛出此错误的行。 - Dean Or
1
我有一个解决1300错误的方法,可以添加一个IGNORE子句。但这会导致文本被截断,例如¡Felicidades将变成Felicidades。基本上,这个字符串已经是UTF8格式的,转换为Latin1再转回UTF8会导致数据丢失。如果原始字节发生改变,您可以添加以下条件来跳过这些行:HEX(CONVERT(title USING latin1)) = HEX(CONVERT(CONVERT(CONVERT(title USING latin1) USING BINARY) USING utf8)) - Dean Or

2
情况并不像你想的那么糟,除非你的数据库已经有很多非罗马字符(即不能用Latin-1表示的字符)。Latin-1是utf8的一个子集。您的Web应用程序使用utf8工作,您表格的内容也是utf8。因此,无需转换表格。
尝试将SET NAMES latin1更改为SET NAMES utf8。这可能会解决您的问题,通过允许您的php程序连接与连接两端的代码使用相同的字符集。
阅读此文档:http://dev.mysql.com/doc/refman/5.7/en/charset-connection.html

数据库包含许多带有重音的匈牙利字符串,这些字符串无法用latin1表示。该页面使用SET NAMES latin1工作,如果我将其更改为SET NAMES utf8,则会产生混乱。 我需要导入一个包含匈牙利每个城市名称的新表。它是以正确的UTF8格式编写的,因此如果我将DB作为latin1访问,它将搞乱这个表。因此,我要么将当前的DB转换为正确的UTF8,要么将城市列表转换为强制的latin1。我更喜欢前者。 - Moha

0

修改列数据类型

VARBINARY 它会自动转换Latin1数据

谢谢大家。 希望有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接