MySQL 将表转换为 latin1 不会将外来字符转换为正确的表示形式

标签 mysql utf-8 character-encoding latin1

我有一个为 PHP 应用程序提供服务的数据库,其中存储了非英文字符,例如:çã é

以前,该数据库已正确存储和显示这些字符,但在备份和恢复后,其位置上的一些字符在应该显示时已被替换为诸如 ç㣠之类的组合

显然这是备份或恢复字符集的疏忽,但是我无法检索数据库以前的良好版本。

此转储文件是数据库的所有剩余部分,并且在文本编辑器中打开时,它还会显示 çã 等组合,而不是 çã

我尝试将其中一个表从 utf8_unicode_ci 转换为 latin1_swedish_ci 或反之,但没有效果。

ALTER TABLE test CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE test CONVERT TO CHARACTER SET latin1 COLLATE latin1_swedish_ci;

如何解决这个问题。

谢谢。

注意: PHP 中的 utf8_decode 能够将 á§à£ 转换为 ça,但我会希望从源头上解决这个问题。

<小时/>

更新:我能够查询受影响的表并让它通过以下查询返回正确的字符。

从受影响的表中选择转换(cast(转换(使用latin1的field_name)作为二进制)使用utf8)

<小时/>

更新2:

下面的查询能够将字符转换为其正确的 UTF-8 表示形式。

SELECT convert(cast(convert(field_name using  latin1) as binary) using utf8) FROM affectedTable

因此,按照上一个查询中的方法,如果您对每个受影响的表运行以下三个查询,它应该将字符转换为 UTF-8。

ALTER TABLE table CONVERT TO CHARACTER SET latin1;
ALTER TABLE table CONVERT TO CHARACTER SET binary;
ALTER TABLE table CONVERT TO CHARACTER SET utf8;

就是这样,像 ça£ 这样的字符将被转换为 ça 等等。

这适用于 Windows 上的 MySQL 5.6.20 - 社区服务器,但不适用于 Linux 上的 MySQL 5.5.42 - 社区服务器。也许有人知道跨版本/操作系统的解决方案。

最佳答案

听起来你表中的数据存储为latin1,但实际上是utf8。

在执行“转换为字符集”时,它通常会尝试将字符从“latin1”基本上转换为“utf8”

要在不更改数据的情况下更改类型,您需要首先将该列转换为二进制列,然后转换为最终目标字符集,这应避免任何实际的字符转换。

这里的文档对此进行了讨论: https://dev.mysql.com/doc/refman/5.5/en/charset-conversion.html

关于MySQL 将表转换为 latin1 不会将外来字符转换为正确的表示形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30402318/

相关文章:

java - Java 属性中的西类牙语字符 óé 显示错误

mysql - 在 Docker 容器中运行 MySQL

MySQL:选择全部,除非一列包含一个特定值而另一列包含另一个特定值

java - 在 JSP 中使用 MySQL 连接到 Tomcat 服务器

swift - 为什么 String.addingPercentEncoding() 的返回值是可选的?

android - strings.xml 文件中的表情符号?

encoding - Spring Boot(1.2.5.RELEASE)Resttemplate 多部分文件上传 UTF-8 文件名不可能

vba - 如何将 Unicode 字符保存到文本文件

asp.net - 为什么我的 StreamWriter Response 输出在 Excel 中产生垃圾重音,但在记事本中看起来很好?

mysql - SQLYog 为 MySQL 设置变量返回 null