编码PHP / MySQL中的问题

时间:2009-06-13 09:30:17

标签: php mysql encoding

编辑:在我的原始帖子反馈后,我更改了文字以澄清我的问题。

我有以下查询(伪代码):

$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
  • 如果我直接在phpMyAdmin中运行查询,我会得到结果。
  • 表格编码:UTF-8
  • HTML页面编码:UTF-8
  • 我可以添加名称使用重音的记录(来自表单输入)(例如“Fióre`sHäßelberg”)
  • 使用时可以读取带重音的记录 - > “name LIKE'$ labelName%'”
  • 数据库中的信息看起来很好

我不知道为什么我不能选择任何名称都有重音字符的行。

我真的希望有人可以帮助我。

更新1: 我达成了妥协。我将在存储数据时使用htmlentities转换重音,并在从DB检索数据时转换html_entity_decode。这似乎有效。

到目前为止我唯一看到的缺点是,我无法使用phpMySQL以明文形式读取名称。

6 个答案:

答案 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字符的表示形式是相同的。