繁体   English   中英

PHP / MySQL中的编码问题

[英]Encoding problems in 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     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来转换重音符号,在从数据库中检索数据时,将使用html_entity_decode来转换重音符号。 这似乎有效。

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

我认为您应该返回$result不是$this->query

另外,您应该了解SQL注入,并考虑使用mysql_real_escape_string或Prepared Statements保护您免受此类攻击。 addslashes不是适当的保护。

试试这个查询。 如果获得结果,则查询中的反引号字符会出现问题

SELECT * FROM sl_label WHERE name Like 'Church%'

正如其他答案所表明的那样,这似乎很像一个编码问题。 我建议打开查询日志记录( 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 ),以了解如何获取来自表单帖子的正确数据。

也许可以在调用查询后尝试检查错误消息(如果您尚未在该函数之外执行此操作)。 可能是在告诉您到底出了什么问题。

正如Artem所说,打印出实际的查询是一个好主意-有时情况与您期望的不完全相同。

这可能是一个编码问题,“教堂”中的“”可能是一个花哨的字符。 PHPMyAdmin可以是UTF-8,而您自己的PHP网站可以是iso-latin1。

我在看这条线

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM