社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

php/mysql中的编码问题

Chris B. • 5 年前 • 551 次点击  

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

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

$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
 
551 次点击  
文章 [ 6 ]  |  最新文章 5 年前
Steve Mallory
Reply   •   1 楼
Steve Mallory    14 年前

我在看这条线

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    14 年前

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

Jarod Elliott
Reply   •   3 楼
Jarod Elliott    14 年前

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

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

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

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

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

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

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

Martin Olsen
Reply   •   6 楼
Martin Olsen    14 年前

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