问题描述
在将我们开发服务器上的PHP从5.2升级到5.3之后,我们遇到一个问题,在试图显示俄文字符时,从数据库请求并显示在网页上的数据会以不正确的编码显示。
环境
详细信息
在PHP5.3中,用于与MySQL数据库交互的默认客户端库从libmysql更改为mysqlnd,这似乎是我们遇到问题的原因。
我们使用以下代码连接到数据库:
$conn = mysql_pconnect('database.hostname', 'database_user', 'database_password');
$mysql_select_db('database', $conn);存储在数据库中的数据采用UTF-8编码.通过命令行客户端连接到数据库并运行查询,可以确认数据完整且编码正确。但是,当我们在PHP中查询数据库并试图显示完全相同的数据时,它就会变得乱七八糟。在这个特殊情况下,我们试图显示俄语字符,结果是非英语,非俄语字符:

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

我们在使用编码在严格模式下显示字符串之前对字符串进行了测试,并在显示字符串之前被告知字符串是UTF-8字符串。我们还使用编码测试客户端编码,并指出字符集为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);我们甚至试过编码,编码
utf8_encode($string);然而,这些解决办法都没有奏效。
由于没有选择,我们将开发系统上的MySQL升级到了远端5.1.55。升级之后,当我们连接到开发数据库时,所有内容都会正确显示。当然,当我们连接到我们的实时数据库时,它继续不正确地显示。
理想情况下,我们希望在不升级生产服务器上的MySQL的情况下解决这个问题,除非我们能够验证不工作的确切原因以及升级将修复它的原因。如何在不升级MySQL的情况下解决这个编码问题?或者,为什么MySQL升级要修复这个问题?
发布于 2011-03-04 09:10:19
如果确保表和输出编码都是UTF-8,那么剩下的几乎唯一的东西就是连接编码。
更新服务器时行为发生变化的原因可能是默认连接编码的更改:
[mysql]
default-character-set=utf8但是,我看不到不同版本之间的默认编码发生了任何变化,所以如果这些是全新的安装,我无法看到这种情况发生。
无论如何,如果您在PHP查询中运行它并输出结果,会发生什么情况。命令行输出有什么不同吗?
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%'; 发布于 2011-03-04 01:20:09
我看您已经尝试过了,但是我使用的语法是:mysql_query(“设置名称utf8")。您的语法可能是正确的,我以前从未见过这样的情况。
示例:
// connect to database stuff
$Connection = mysql_connect($server, $username, $password)
or die ("Error connecting to server");
// connect to database stuff
$db = mysql_select_db($database, $Connection)
or die ("Error selecting database");
mysql_query("SET NAMES utf8");发布于 2011-03-09 09:30:20
在将PHP从5.2.3升级到5.3.5 (5.3.5-Win32-VC6-x86)、MySQL 5.0.41 (未更新)之后,我遇到了类似的问题。我认为这个原因是PHP版本之间的一些差异。
PHP 5.2.3默认设置(没有设置名称):
character_set_client = latin1
character_set_connection = latin1
character_set_database = utf8
character_set_filesystem =二进制
character_set_results = latin1
character_set_server = latin2
character_set_system = utf8
collation_connection = latin1_swedish_ci
collation_database = utf8_polish_ci
collation_server = latin2_general_ci
PHP 5.3.5默认设置(没有设置名称):
character_set_client = latin2
character_set_connection = latin2
character_set_database = utf8
character_set_filesystem =二进制
character_set_results = latin2
character_set_server = latin2
character_set_system = utf8
collation_connection = latin2_general_ci
collation_database = utf8_polish_ci
collation_server = latin2_general_ci
我在PHP5.2.3默认情况下向数据库添加了数据(没有设置名称),因此,为了正确显示数据,我必须使用以下方法读取数据:
$pdo -> query("SET NAMES 'latin1'");也许你的问题也有类似的原因。
https://stackoverflow.com/questions/5187761
复制相似问题