我已经在网上搜索了几个小时,但我发现似乎没有任何帮助。这在我使用 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 帖子正确显示。另一个根本不显示。不是它显示一个正方形或块而不是引号 - 它不显示任何东西。
我尝试将 mysql_fetch_array 更改为 mysql_fetch_assoc。那没有帮助。我出于沮丧尝试了 utf8_encode ,但这也无济于事。
我读到有些人对 IIS / PHP 5.4.9 / FastCGI 的组合有问题,所以我卸载了 FastCGI。至少我尽了最大努力——文件都不见了,IIS 再次指向 php-cgi.exe 文件。但是 PHP 仍然报告它正在使用 FastCGI。我认为它必须在注册表中看到一些东西?但无论如何,文件都不见了,所以它真的不可能。它没有帮助。
在这一点上,我什至会尝试一些疯狂的想法来让它发挥作用。有什么想法吗?
更新:
我现在已经用 PHP 和 ASP 对此进行了测试。两种语言都给出相同的行为。我的更新代码的结果集给出了以下结果:
没有 unicode 的帖子主题:没有 unicode 的测试帖子
没有 unicode 的帖子正文:测试帖子中只包含普通字符,以及用于测试的 xyzzy。
体场长度:74
使用 unicode 发布主题:使用 unicode 测试帖子
使用 unicode 发布正文:
正文字段长度:0
因此,在检查长度后,ASP 和 PHP 都报告该字段的长度为零。
可能是 ODBC 有问题吗?即使我试图删除它,它是否仍然会干扰 FastCGI?
更新 2 -
为了解决这个问题,我必须做的是从备份中重新加载数据,将数据重新加载到已经设置为 UTF8 的表中,并将字段设置为 UTF8。然后我必须在连接后立即在代码中执行 set names utf8 命令。我认为这里没有涉及 FastCGI - 当我重新安装 FastCGI 时,一切都还可以。我仍然有一些琐碎的问题,但我认为表设置和重新加载处理了我的大部分问题。
丽莎