2015-04-02 82 views
0

我的UTF8使用Windows软件连接数据库并查看数据时看起来数据看起来很糟糕。 虽然我的PHP脚本功能虽然很好(包括阅读和写作)。UTF8 character_set_server和DataTables插件

我已经尝试过我的本地主机上的脚本,一切都很好,从客户端查看时也很好。但在共享主机服务器上的事情是不同的。

从我所知,唯一的区别是被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

首先,让我们来判断数据是在_input_上还是在_output_上被损坏。请提供'SELECT col,HEX(col)...'的输出,从某个表中读取一些破损的列。 – 2015-04-02 22:37:00

+0

@Rick James价值“25英镑”的HEX = C382C2A33235。 – PapaLazarou 2015-04-02 23:14:04

回答

0

鉴于£25被存储为十六进制C382 C2A3 32 35,您有“双编码”问题,我在my blog讨论。

很可能发生了什么事情是,当你插入它时,你有用utf8编码的£25(十六进制: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。 (该25没有改变;编码在两个字符集相同。)

如果与客户端读取它错误地宣布latin1的,这些步骤将被扭转,而你不会知道什么是错误。但是,显然,您的第二个客户的声明是不同的。 (检查点:这听起来是否正确?)

您应该修复错误地插入内容的客户端,并且应该修复数据。这是两个独立的任务,应该基本同时完成。博客解释了它,但可能不容易梳理出来。你现在想做什么?

+0

是的,我认为你的双重编码点的权利。在我的第二个客户端上,我通过更改my.ini配置文件手动将服务器设置为处理UTF8。那么如何解决这个有问题的服务器?我只有3条记录需要UTF8,因此可以手动更改它们。我是否需要更改表格或发出命令PHP命令来修复后续的插入/更新?我记得当我做正确的事情,并得到C2A33235数据表的HEX值拒绝显示字段内容(无效的UTF8数据)。 – PapaLazarou 2015-04-03 00:33:20

+0

手动更新行可能是最简单和最安全的。你知道他们应该说什么,并且这些字符串是可管理的大小吗? – 2015-04-03 01:57:57

+0

那么我确实玩过数据库,我得到了正确的值,例如£25 = C2A33235对不对?但是当它像这个Datatables不显示任何字段时,它似乎只有Double编码字段。如果我能改变character_set_server,我想我可以解决这个问题。 – PapaLazarou 2015-04-03 23:53:52