问题说明
在将我们的开发服务器上的PHP从5.2升级到5.3之后,我们遇到了一个问题,即在尝试显示俄语字符时,从我们的数据库请求并显示在网页上的数据显示编码不正确.
环境
>开发操作系统:Debian GNU / Linux 6.0
> Dev PHP:5.3.5-0.dotdeb.1
> Live MySQL:Distrib 5.1.49
细节
在PHP 5.3中,用于与MySQL数据库交互的默认客户端库从libmysql更改为mysqlnd,这似乎是我们遇到的问题的原因.
我们使用以下代码连接到数据库:
$conn = mysql_pconnect('database.hostname', 'database_user', 'database_password');
$mysql_select_db('database', $conn);
存储在我们数据库中的数据使用UTF-8编码进行编码.通过命令行客户端连接到数据库并运行查询,确认数据完好无损且编码正确.但是,当我们在PHP中查询数据库并尝试显示完全相同的数据时,它会变得乱码.在这种特定情况下,我们试图显示俄语字符,结果是非英语,非俄语字符:
我们收到的响应标头确认内容类型是UTF-8:
我们在严格模式和mb_check_encoding中使用mb_detect_encoding显示之前测试了字符串,并且在显示之前被告知字符串是UTF-8字符串.我们还使用mysql_client_encoding来测试客户端编码,它还表明字符集是UTF-8.
在进行研究时,我们发现some suggestions试图解决这个问题:
header("Content-type: text/html; charset=utf-8");
mysql_set_charset('utf8');
mysql_query("SET SESSION character_set_results = 'UTF8'");
mysql_query('SET NAMES UTF8', $conn);
utf8_encode($string);
但是,这些解决方案都没有奏效.
用完选项后,我们将开发系统上的MySQL升级到Distrib 5.1.55.在升级之后,当我们连接到开发数据库时,一切都正确显示.当然,当我们连接到我们的实时数据库时,它会继续显示不正确.
理想情况下,我们希望在不升级生产服务器上的MySQL的情况下解决此问题,除非我们可以验证其不起作用的确切原因以及升级为什么要修复它.如何在不升级MySQL的情况下解决此编码问题?或者,为什么MySQL升级修复了这个问题?