2009-06-13 91 views
1

编辑:从我原来的帖子反馈后,我改变了文本,以澄清我的问题。PHP/MySQL中的编码问题

我有以下查询(伪码):

$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  [email protected] 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`s海瑟伯格”)
  • 我可以读带重音符号的使用记录时 - >“名称LIKE‘$标签%’”
  • 在数据库中的信息看起来不错

我不知道为什么我不能选择哪个名字有重音字符的任意行。

我真的希望有人能帮助我。

更新1: 我已经达成妥协。我将在存储数据时将htmlentities和html_entity_decode转换为从数据库检索数据时的转换。这似乎工作。

迄今为止我看到的唯一缺点是我无法使用phpMySQL读取明文中的名称。

+2

你可以按照脚本中的方式发送调用函数吗?你可以打印$ sql,看看它是什么样子? – 2009-06-13 09:35:50

+0

完成。如果我使用输出的sql并直接在PHPMyADmin中使用它,它可以正常工作。我得到了我想要的结果。 – Steven 2009-06-13 10:15:43

+0

你在上面声明该查询的PHP文件中使用了什么编码?您还需要使用UTF-8以避免冲突。 – Gumbo 2009-06-15 14:52:45

回答

2

正如其他答案指出,这非常像一个编码问题。我建议打开查询日志记录(http://dev.mysql.com/doc/refman/5.1/en/query-log.html),因为它可以显示数据库真正接收的内容。

UPDATE: 我终于找到了解释PHP的肮脏细节和UTF-8(http://www.phpwact.org/php/i18n/charsets)的页面。另外,请务必阅读(http://niwo.mnsys.org/saved/~flavell/charset/form-i18n.html)以了解如何从表单帖子返回适当的数据。

0

也许尝试在调用查询后检查错误消息(如果您尚未在该函数之外执行此操作)。它可能会告诉你到底发生了什么问题。作为Artem评论说,打印出实际的查询是一个好主意 - 有时候事情并不完全如你所期望的那样。

+0

没有错误。它只返回0行。 – Steven 2009-06-13 10:24:39

0

这可能是一个编码问题,'在教堂里可能是一个奇特的角色。 PHPMyAdmin可以是UTF-8,你自己的PHP网站可以是iso-latin1。

+0

Nah。添加utf8_encode()没有帮助。 – Steven 2009-06-13 10:23:40

+0

看起来你是对的。但我不知道如何解决这个问题。查看我的帖子更新。 – Steven 2009-06-13 14:14:34

+0

打开连接后,执行mysql_set_charset('utf8')。或者,运行SQL查询“SET CHARACTER SET'utf8'”和“SET NAMES'utf8'”。 – Andomar 2009-06-13 15:16:02

4

我觉得你应该比$this->query更合适$result

此外,您应该知道SQL injection并考虑使用mysql_real_escape_string或Prepared Statements来防止此类攻击。 addslashes不是一个适当的保护。

2

试试此查询。如果你得到的结果,那么这是一个反查问题,在查询

SELECT * FROM sl_label WHERE name Like 'Church%' 
0

我在看这条线

mysql_query("SET NAMES 'utf8'; COLLATE='utf8_danish_ci';"); 

,我认为这可能是一个错误。用';'您正在向服务器发送两个查询,但COLLATE是一个子句,而不是它自己的法律声明。尝试:

mysql_query("SET NAMES 'utf8' COLLATE 'utf8_danish_ci'"); 

如果COLLATE子句没有被服务器接受,你可能会具有带danish_ci排序规则,标签栏的问题,但在未来的声明有默认值(概率utf_general_ci)。重音字符将不匹配,但通配符可用,因为基本ascii字符的表示形式相同。