将MySql数据从Latin1转换为UTF8

时间:2016-10-18 09:10:32

标签: mysql data-conversion

这是一个常见的问题已被多次询问。但是我仍然无法从谷歌那里得到正确的答案。

在我的网络应用程序中,有一个用于收集数据的表单,应用程序和所有数据都以UTF-8收集。但是,错误地,架构和表的集合已设置为latin1。此外,在连接期间,使用了“SET NAMES UTF8”。

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

如果我的数据仍然能够转换为utf-8并正确显示或已经丢失?

[UPDATE]

这与How to convert an entire MySQL database characterset and collation to UTF-8?的问题不同,因为我不仅将整个数据库和表转换为UTF-8,还将mysqldump转换为数据库。但是,它们都不起作用。

[更新2]

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

基础知识是:

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

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

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

所以,这样的中文和日文,它需要2到3个字节进行存储,这会在存储过程中损坏数据,因为UTF-8表示中的第一个字节已经超出了Latin可以存储的范围。

这就是为什么无论我如何改变数据库和表的字符集,它仍然显示'?',因为在拉丁语中,超出范围的每个字符都将以'?',3F在HEX中呈现。< / p>

1 个答案:

答案 0 :(得分:0)

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

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;

当然,你可以为某张桌子做这件事。

Further more have a look at the documentation here.

修改

其他如果您的数据已经在&#34;?&#34;标志,现实是它被损坏了。