升级到PHP 5.3后显示MySQL数据库结果时解决错误的字符编码

Sha*_*aun 10 php mysql character-encoding

问题说明

在将我们的开发服务器上的PHP从5.2升级到5.3之后,我们遇到了一个问题,即在尝试显示俄语字符时,从我们的数据库请求并显示在网页上的数据显示编码不正确.

环境

  • 开发操作系统:Debian GNU/Linux 6.0
  • 开发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);
Run Code Online (Sandbox Code Playgroud)

存储在我们数据库中的数据使用UTF-8编码进行编码.通过命令行客户端连接到数据库并运行查询,确认数据完好无损且编码正确.但是,当我们在PHP中查询数据库并尝试显示完全相同的数据时,它会变得乱码.在这种特定情况下,我们试图显示俄语字符,结果是非英语,非俄语字符: 乱糟糟的

我们收到的响应标头确认内容类型是UTF-8:

响应标头

我们测试显示之前的字符串与mb_detect_encoding严格模式以及mb_check_encoding,并被告知该字符串显示前一个UTF-8字符串.我们还使用mysql_client_encoding来测试客户端编码,它还表明字符集是UTF-8.

在进行研究时,我们发现了一些尝试解决此问题的建议:

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);
Run Code Online (Sandbox Code Playgroud)

我们甚至尝试过utf8_encode:

utf8_encode($string);
Run Code Online (Sandbox Code Playgroud)

但是,这些解决方案都没有奏效.

用完选项后,我们将开发系统上的MySQL升级到Distrib 5.1.55.在升级之后,当我们连接到开发数据库时,一切都正确显示.当然,当我们连接到我们的实时数据库时,它会继续显示不正确.

理想情况下,我们希望在不升级生产服务器上的MySQL的情况下解决此问题,除非我们可以验证无法正常工作的原因以及升级为什么要修复它.如何在不升级MySQL的情况下解决此编码问题?或者,为什么MySQL升级修复了这个问题?

Pek*_*ica 3

如果您已确保两个表和输出编码都是 UTF-8,那么几乎唯一剩下的就是连接编码。

更新服务器时行为发生变化的原因可能是默认连接编码的更改:

[mysql]
default-character-set=utf8
Run Code Online (Sandbox Code Playgroud)

但是,我看不到版本之间默认编码的任何更改,因此如果这些是全新安装,我看不到这种情况发生。

无论如何,如果您在 PHP 查询中运行它并输出结果,会发生什么。与命令行输出有什么不同吗?

 SHOW VARIABLES LIKE 'character_set%';
 SHOW VARIABLES LIKE 'collation%'; 
Run Code Online (Sandbox Code Playgroud)