我已经在网上搜索了几个小时了,似乎没有找到任何帮助。当我在PHP 5.3和MySQL 5.1上工作时,这是很好的。当我升级这两个时,我意识到对包含UniCode字符的字段进行的选择会给出空白结果。
表被设置为UTF8,特别是字段也被设置为UTF8以防万一。我有一个charset=utf-8在我的文档的标题区域。
我在我的论坛上做了两个测试帖子,一个是直文本,一个是花引号。然后,我创建了一个简单的PHP查询来获取这两行。代码的要点如下:
<?php
$con = mysql_connect("XXXXX","XXXXX","XXXXX");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("XXXXX", $con);
echo "<br />";
echo "<br />";
echo "PHP 5.4.9 having issues displaying UniCode characters. MySQL 5.5.28.3. FastCGI has been removed. IIS.";
echo "<br />";
echo "<br />";
$result1 = mysql_query("SET NAMES 'utf8'");
$result = mysql_query("SELECT post_body from ubbt_posts where post_id = 358826");
while($row = mysql_fetch_array($result))
{
echo "Post Body without unicode: " . $row['post_body'];
echo "<br />";
echo "<br />";
}
$result = mysql_query("SELECT post_body from ubbt_posts where post_id = 358825");
while($row = mysql_fetch_array($result))
{
echo "Post Body with unicode: " . $row['post_body'];
echo "<br />";
echo "<br />";
}
mysql_close($con);
?>
行为是正确显示非unicode post。另一个根本不显示。这并不是说它显示了一个方框或块来代替引号——它不显示任何。
我试过改变mysql_fetch_array到mysql_fetch_assoc。但这无济于事。出于无奈,我尝试了utf8_encode,但也无济于事。
我读到有些人对IIS/PHP 5.4.9/FastCGI组合有问题,所以我卸载了FastCGI。至少我尽了最大的努力-文件都消失了,IIS再次指向php-cgi.exe文件。但是PHP仍然报告它正在使用FastCGI。我想它一定是在注册表上看到了什么?但无论如何,文件都不见了,所以真的不可能。但这并没有帮助。
在这一点上,我甚至会尝试一些疯狂的想法来让它工作。任何想法吗?更新:我现在已经用PHP和ASP进行了测试。两种语言给出相同的行为。我的结果集与更新后的代码给出了这些结果:
Post Subject without unicode: test Post without unicode
Post Body没有unicode: test Post,只有普通字符,以及xyzzy用于测试。
正文长度:74
Post Subject with unicode: test Post with unicode
Post Body with unicode:
正文字段长度:0
因此在检查长度时,ASP和PHP都报告该字段的长度为零。
可能是ODBC有问题吗?它可能是FastCGI仍然干扰,即使我试图删除它?
UPDATE 2 -
为了解决这个问题,我必须做的是将数据从备份中重新加载到已经设置为UTF8和字段设置为UTF8的表中。然后,我必须在连接之后的代码中执行set names utf8命令。我不认为FastCGI在这里涉及-当我重新安装FastCGI的东西仍然是好的。我仍然有一些琐碎的问题,但我认为表设置和重新加载处理了我的大部分问题。
丽莎尝试用另一种方式设置utf8 -
mysql_set_charset('utf8', $con);
——
mysql_query("SET NAMES 'utf8'");
其中$con
是使用mysql_connect()
方法创建的连接
PDO
或mysqli