将MySql数据从Latin1转换为UTF8

将MySql数据从Latin1转换为UTF8,mysql,data-conversion,Mysql,Data Conversion,这是一个经常被问到的问题。然而,我仍然无法从谷歌那里得到正确的答案 在我的web应用程序中,有一个用于收集数据的表单,该应用程序和所有数据都在UTF-8中收集。但是,模式和表的集合被错误地设置为latin1。此外,在连接过程中,使用了“SET NAMES UTF8” 现在,无论我使用什么转换方法,中文中的一些数据总是显示为任务标记(?)。作为二进制的查询问题列还显示数据是3f的几个字节,表示几个“?” 我的数据是否仍能转换为utf-8并正确显示或已丢失 [更新] 这与问题不同,因为我不仅将整个数

这是一个经常被问到的问题。然而,我仍然无法从谷歌那里得到正确的答案

在我的web应用程序中,有一个用于收集数据的表单,该应用程序和所有数据都在UTF-8中收集。但是,模式和表的集合被错误地设置为latin1。此外,在连接过程中,使用了“SET NAMES UTF8”

现在,无论我使用什么转换方法,中文中的一些数据总是显示为任务标记(?)。作为二进制的查询问题列还显示数据是3f的几个字节,表示几个“?”

我的数据是否仍能转换为utf-8并正确显示或已丢失

[更新]

这与问题不同,因为我不仅将整个数据库和表转换为UTF-8,而且还将mysqldump重新导入数据库。然而,它们都不起作用

[更新2]

问题不仅仅在于转换表字符集,还需要理解UTF-8,拉丁编码系统

基本知识是:

拉丁语仅使用1字节,其中8位用于存储

UTF-8使用动态存储系统,这意味着可能不仅仅是一个字节

由于UTF-8编码系统至少需要1位进行识别,这意味着只有7位可用于存储与拉丁语的比较。因此,如果字符只需要7位来存储,它就可以成功地以UTF-8表示的拉丁语存储。然而,如果数据超过7位,它将被破坏

所以,像中文和日文,它需要2到3个字节来存储,这将在存储过程中损坏数据,因为UTF-8表示中的第一个字节已经超出了拉丁语可以存储的范围


这就是为什么无论我如何更改数据库和表的字符集,它仍然显示“?”,因为在拉丁语中,超出范围的每个字符都将以“?”,3F的十六进制表示。

只需更改整个数据库的字符集:

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
当然,你可以在一些桌子上做

编辑:


否则,如果您的数据已被写入“?”标记,则实际情况是数据已损坏。

只需更改整个数据库的字符集:

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
当然,你可以在一些桌子上做

编辑:


否则,如果您的数据已经用“?”标记保存,那么实际情况是它已经损坏。

我已经更改了数据库和表,但它什么也没有更改。我已经更改了数据库和表,但它什么也没有更改。@HoussemBdr我已经这样做了,但没有更改。请提供更多详细信息,您是如何使用json进行转换的?还有别的吗?@HoussemBdr A UTF8中文使用3个字节来存储,比如'們' 在\xE5\x80\x91中。将其存储到latin1表后,它将变为“?”。所以我使用ALTERTABLE将表集合从latin1更改为utf8,它仍然显示在“?”中。通过使用Convert(使用二进制的列),它仍然显示在“?”中。似乎最后2个字节在存储过程中被删除了。我的阿拉伯语总是这样。在创建alter数据库后,检查新存储的中文单词,而不是已存储的单词ones@HoussemBdr这篇文章的目的是恢复已经存储在表中的数据,但是发现这是不可能的。原因已在帖子中更新。谢谢您的评论。@HoussemBdr我已经完成了,没有任何更改。请提供更多详细信息,您是如何使用json进行转换的?还有别的吗?@HoussemBdr A UTF8中文使用3个字节来存储,比如'們' 在\xE5\x80\x91中。将其存储到latin1表后,它将变为“?”。所以我使用ALTERTABLE将表集合从latin1更改为utf8,它仍然显示在“?”中。通过使用Convert(使用二进制的列),它仍然显示在“?”中。似乎最后2个字节在存储过程中被删除了。我的阿拉伯语总是这样。在创建alter数据库后,检查新存储的中文单词,而不是已存储的单词ones@HoussemBdr这篇文章的目的是恢复已经存储在表中的数据,但是发现这是不可能的。原因已在帖子中更新。谢谢你的评论。