【问题标题】:Problem in query (PHP MYSQL UTF-8 )查询中的问题(PHP MYSQL UTF-8)
【发布时间】:2011-08-21 19:53:01
【问题描述】:

在阅读了这里和其他地方的许多技巧之后,我想我终于完成了我的 GET 查询,PHP 和 MYSQL 都使用 utf8。但是,当我匹配的字符串包含非 ascii 字符时,我无法获得一个简单的查询。我的(简化的)代码是:

$link = mysql_connect("h", "u", "p") or die(mysql_error());
mysql_select_db("db", $link) or die(mysql_error($link));
mysql_set_charset("utf8", $link); //connection charset
$name = mysql_real_escape_string($_GET['first'], $link);
$query = sprintf("SELECT name, date FROM guestbook WHERE name='%s'", $name);
$result = mysql_query($query, $link) or die(mysql_error()); 
if (mysql_num_rows($result) == 0) {
...
}

如果 'first' 是 ascii,则查询有效,如果它包含重音字符则无效。当我打印出 db(在 php 生成的表中)时,它看起来很好,在 phpadmin 中查看也是如此。

我做错了什么?我需要告诉 '=' 运算符使用 utf8 吗?为什么?

谢谢

【问题讨论】:

  • 看起来不错,并不意味着它很好。 name 列的排序规则是什么?

标签: php mysql utf-8


【解决方案1】:

表格本身的字符集是什么?

另外,请尝试在连接后立即运行以下查询:

SET NAMES UTF8;

【讨论】:

  • 没必要,因为他用的是mysql_set_charset。
  • 据我所知,一切都是 utf8。 (验证这一点的最佳方法是什么?我可以运行查询吗?)。 mysql_set_charset 也应该执行 SET NAMES UTF8 步骤。
  • CREATE TABLE guestbook` (id int(10) unsigned NOT NULL AUTO_INCREMENT, name varchar(20) NOT NULL DEFAULT '', nname varchar(20) NOT NULL DEFAULT '', comments text NOT NULL, date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id) ) ENGINE=MyISAM AUTO_INCREMENT=91 DEFAULT CHARSET=utf8 COMMENT='simple test table'`
  • 您确定将数据以 utf8 格式发送到 PHP 脚本吗? (例如,您是否添加了 Content-Type: text/html; charset=utf-8 标头或等效的元标记?)
  • 好吧,如果我记得如果您的表曾经是 latin1(例如)如果您将表排序规则更改为 UTF-8,那么已经存在的列不会更改它们的排序规则,它只会起作用对于新列。我认为当您将字符集设置为 MySQL 连接时,它应该处理这个问题(期望 utf8 并在 latin1 中进行内部搜索)但值得尝试创建一个新的干净表 UTF8/utf8_general_ci(不是 utf8_bin),插入几行并查看他们起来看看是否还好。
【解决方案2】:

您是否尝试在查询之前将名称编码为 UTF-8?

$query = sprintf("SELECT name, date FROM guestbook WHERE name='%s'", utf8_encode($name));

如果这不起作用,请尝试utf8_decode。听起来很奇怪,但我遇到了一些奇怪的案例。

【讨论】:

  • 不,这没有帮助(任何一个版本)
猜你喜欢
  • 2011-06-05
  • 2012-04-11
  • 1970-01-01
  • 2011-11-30
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
  • 1970-01-01
相关资源
最近更新 更多