这是一个常见的问题已被多次询问。但是我仍然无法从谷歌那里得到正确的答案。
在我的网络应用程序中,有一个用于收集数据的表单,应用程序和所有数据都以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>
答案 0 :(得分:0)
Juste更改整个数据库的字符集:
ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
当然,你可以为某张桌子做这件事。
Further more have a look at the documentation here.
修改强>
其他如果您的数据已经在&#34;?&#34;标志,现实是它被损坏了。