Sha*_*aun 10 php mysql character-encoding
在将我们的开发服务器上的PHP从5.2升级到5.3之后,我们遇到了一个问题,即在尝试显示俄语字符时,从我们的数据库请求并显示在网页上的数据显示编码不正确.
在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升级修复了这个问题?
如果您已确保两个表和输出编码都是 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)
| 归档时间: |
|
| 查看次数: |
21659 次 |
| 最近记录: |