首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >升级到PHP5.3后显示MySQL数据库结果时解析不正确的字符编码

问升级到PHP5.3后显示MySQL数据库结果时解析不正确的字符编码
EN

Stack Overflow用户
提问于 2011-03-03 23:08:03
回答 3查看 23.1K关注 0票数 11

问题描述

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

环境

  • Dev OS: Debian GNU/Linux 6.0
  • 开发PHP: 5.3.5-0.dotdeb.1
  • 直播MySQL:下位5.1.49

详细信息

在PHP5.3中,用于与MySQL数据库交互的默认客户端库从libmysql更改为mysqlnd,这似乎是我们遇到问题的原因。

我们使用以下代码连接到数据库:

代码语言:javascript
复制
$conn = mysql_pconnect('database.hostname', 'database_user', 'database_password');
$mysql_select_db('database', $conn);

存储在数据库中的数据采用UTF-8编码.通过命令行客户端连接到数据库并运行查询,可以确认数据完整且编码正确。但是,当我们在PHP中查询数据库并试图显示完全相同的数据时,它就会变得乱七八糟。在这个特殊情况下,我们试图显示俄语字符,结果是非英语,非俄语字符:

​

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

​

​

我们在使用编码在严格模式下显示字符串之前对字符串进行了测试,并在显示字符串之前被告知字符串是UTF-8字符串。我们还使用编码测试客户端编码,并指出字符集为UTF-8。

在进行研究时,我们发现几点建议试图解决这个问题:

代码语言:javascript
复制
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);

我们甚至试过编码,编码

代码语言:javascript
复制
utf8_encode($string);

然而,这些解决办法都没有奏效。

由于没有选择,我们将开发系统上的MySQL升级到了远端5.1.55。升级之后,当我们连接到开发数据库时,所有内容都会正确显示。当然,当我们连接到我们的实时数据库时,它继续不正确地显示。

理想情况下,我们希望在不升级生产服务器上的MySQL的情况下解决这个问题,除非我们能够验证不工作的确切原因以及升级将修复它的原因。如何在不升级MySQL的情况下解决这个编码问题?或者,为什么MySQL升级要修复这个问题?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-04 09:10:19

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

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

代码语言:javascript
复制
[mysql]
default-character-set=utf8

但是,我看不到不同版本之间的默认编码发生了任何变化,所以如果这些是全新的安装,我无法看到这种情况发生。

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

代码语言:javascript
复制
 SHOW VARIABLES LIKE 'character_set%';
 SHOW VARIABLES LIKE 'collation%'; 
票数 3
EN

Stack Overflow用户

发布于 2011-03-04 01:20:09

我看您已经尝试过了,但是我使用的语法是:mysql_query(“设置名称utf8")。您的语法可能是正确的,我以前从未见过这样的情况。

示例:

代码语言:javascript
复制
// 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");
票数 4
EN

Stack Overflow用户

发布于 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默认情况下向数据库添加了数据(没有设置名称),因此,为了正确显示数据,我必须使用以下方法读取数据:

代码语言:javascript
复制
$pdo -> query("SET NAMES 'latin1'");

也许你的问题也有类似的原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5187761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档