Py学习  »  DATABASE

php/mysql中的编码问题

Chris B. • 6 年前 • 751 次点击  

编辑:在收到我原来的帖子的反馈后,我修改了文本来澄清我的问题。

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

$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_3;re's h_ elberg”)。
  • 使用->“name like'$labelname%”,可以读取带有重音的记录。
  • 数据库中的信息看起来不错

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

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

更新1: 我已达成妥协。我将在存储数据时使用htmlentities转换重音符号,在从数据库检索数据时使用html_entity_解码。这似乎奏效了。

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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/30742
 
751 次点击  
文章 [ 6 ]  |  最新文章 6 年前
Steve Mallory
Reply   •   1 楼
Steve Mallory    16 年前

我在看这条线

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

我认为这可能是个错误。对于“;”您将向服务器发送两个查询,但collate是一个子句,而不是一个单独的合法声明。尝试:

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

如果服务器不接受collate子句,您的label列可能存在丹麦语\u-ci排序问题,但传入的语句具有默认值(prob-utf \u-general \u-ci)。重音字符不匹配,但通配符起作用,因为基本ASCII字符的表示形式相同。

Andomar
Reply   •   2 楼
Andomar    16 年前

这可能是一个编码问题,“in church”可能是一个花哨的字符。phpmyadmin可以是utf-8,您自己的php网站可以是iso-latin1。

Jarod Elliott
Reply   •   3 楼
Jarod Elliott    16 年前

可能在调用查询后尝试检查错误消息(如果您在该函数之外还没有这样做)。它可能会告诉你到底出了什么问题。

正如阿耳特姆所评论的,打印出实际的查询是一个好主意——有时候事情并不像你期望的那样。

Ólafur Waage
Reply   •   4 楼
Ólafur Waage    16 年前

尝试此查询。如果得到结果,那么查询中的反勾号字符就会出现问题。

SELECT * FROM sl_label WHERE name Like 'Church%'
Gumbo
Reply   •   5 楼
Gumbo    16 年前

我想你还是回去吧 $result $this->query .

另外,你应该知道 SQL injection 并考虑使用 mysql_real_escape_string 或准备好声明以保护您免受此类攻击。 addslashes 不是适当的保护。

Martin Olsen
Reply   •   6 楼
Martin Olsen    16 年前

正如其他答案所表明的,这非常像一个编码问题。我建议打开查询日志记录( 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 )了解如何从表单发布中获得正确的数据。