编辑:在我的原始帖子反馈后,我更改了文字以澄清我的问题。
我有以下查询(伪代码):
$conn = mysql_connect('localhost', 'mysql_user', 'mysql_password');
mysql_query("SET NAMES 'utf8'; COLLATE='utf8_danish_ci';");
mysql_query("SELECT id FROM myTable WHERE name = 'Fióre`s måløye'", $conn);
返回0行。
在我的日志文件中,我看到了:
255 Connect root@localhost on
255 Query SET NAMES 'utf8'; COLLATE='utf8_danish_ci'
255 Init DB norwegianfashion
255 Query SELECT id FROM myTable WHERE name = 'Fióre`s måløye'
255 Quit
我不知道为什么我不能选择任何名称都有重音字符的行。
我真的希望有人可以帮助我。
更新1: 我达成了妥协。我将在存储数据时使用htmlentities转换重音,并在从DB检索数据时转换html_entity_decode。这似乎有效。
到目前为止我唯一看到的缺点是,我无法使用phpMySQL以明文形式读取名称。
答案 0 :(得分:4)
我认为您应该返回$result
而不是$this->query
。
此外,您应该了解SQL injection并考虑使用mysql_real_escape_string
或准备好的语句来保护您免受此类攻击。 addslashes
不是适当的保护。
答案 1 :(得分:2)
尝试此查询。如果您得到结果,那么查询中的反引号字符就会出现问题
SELECT * FROM sl_label WHERE name Like 'Church%'
答案 2 :(得分:2)
正如其他答案所示,这似乎是编码问题。我建议启用查询日志记录(http://dev.mysql.com/doc/refman/5.1/en/query-log.html),因为它可以显示数据库真正接收的内容。
<强>更新强>: 我终于找到了一个解释PHP和UTF-8(http://www.phpwact.org/php/i18n/charsets)的脏细节的页面。此外,请务必阅读此内容(http://niwo.mnsys.org/saved/~flavell/charset/form-i18n.html)以了解如何从表单帖子中返回正确的数据。
答案 3 :(得分:0)
也许在调用查询后尝试检查错误消息(如果您在该函数之外尚未执行此操作)。它可能会告诉你到底出了什么问题。
正如Artem评论的那样,打印出实际的查询是一个好主意 - 有时事情并不像你期望的那样。
答案 4 :(得分:0)
这可能是一个编码问题,'在教会中'可能是一个奇特的角色。 PHPMyAdmin可以是UTF-8,您自己的PHP网站可以是iso-latin1。
答案 5 :(得分:0)
我在看这一行
mysql_query("SET NAMES 'utf8'; COLLATE='utf8_danish_ci';");
我认为这可能是一个错误。随着';'您正在向服务器发送两个查询,但COLLATE是一个子句,而不是自己的法律声明。尝试:
mysql_query("SET NAMES 'utf8' COLLATE 'utf8_danish_ci'");
如果服务器未接受COLLATE子句,则可能是您的标签列具有danish_ci排序规则的问题,但是进入的语句具有默认值(prob utf_general_ci)。重音字符不匹配,但通配符有效,因为基本ascii字符的表示形式是相同的。