我的UTF8
数据看起来很糟糕,使用Windows软件连接到数据库并查看数据。
虽然我的PHP脚本功能很好(包括读写)。
我已经在我的localhost上尝试了我的脚本,一切都很棒,从客户端查看它看起来也很好。但是在共享主机服务器上,情况有所不同。
从我可以收集到的唯一区别是character_set_server是latin1
而在我的本地服务器上是utf8
:
| character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ |
我可以通过发出一个SET NAMES UTF8
来解决这个问题,它将数据正确地编码到服务器中。
但这样做会导致DataTables
Jquery插件无法显示该字段。根据作者的说法,如果字段不是正确的UTF8
格式,它将不显示该字段。
怎么回事?如果我没有root权限来更改服务器的设置,我可以解决这个问题吗?
答案 0 :(得分:0)
鉴于£25
已存储为HEX C382 C2A3 32 35
,您可以使用"双重编码"我在my blog中讨论的问题。
可能发生的事情是你在插入时用£25
编码的utf8(十六进制:C2A3 32 35; 32 35是' 25') 。但是你声明客户端正在使用latin1。 (这是许多情况下的默认设置,但这里错了。)同时,您将列声明为CHARACTER SET utf8
。 (检查点:我的分析听起来是否正确?)
所以,MySQL信任你所说的内容,并将C2 A3 32 35
转换为将其作为latin1转换为utf8。 latin1 C2
变为utf8 C382
而latin1 A3
变为utf8 C2A3
。 (2
和5
没有改变;两个字符集中的编码相同。)
如果您在客户端错误地声明latin1时将其读回,则步骤将被撤消,并且您不会知道任何错误。但是,显然,你的第二个客户被宣布不同。 (检查点:这听起来不错吗?)
您应该修复插入错误的客户端,并且应该修复数据。这是两个独立的任务,应该基本上同时完成。博客解释了它,但可能不容易梳理。你现在想做什么?