如何在MySQL中查询包含任意单双引号的文本内容
问题根源
你的参数化查询用法错误,是导致匹配永远失效的核心原因,具体问题有两个:
- 使用Python的MySQL驱动做参数化查询时,不需要手动给字符串参数加单引号,驱动会自动处理所有特殊字符转义、引号包裹逻辑。你额外给url拼接了
\'前后缀,相当于实际查询的是带单引号的URL,和数据库里存储的不带单引号的URL完全匹配不上,自然永远返回count=0。 - 直接用超长HTML文本做匹配条件容易因为空白字符(多余空格、制表符、换行)、编码转换的微小差异导致匹配失败,可靠性极低。
修复方案
第一步:修正查询写法
直接传原始参数即可,不要手动加任何引号,修改后的代码如下:
self.Cursor = self.db.cursor(buffered=True) FetchQuery = "SELECT COUNT(*) FROM scrappedjobs where URL = %s AND JobDescription = %s" # 去掉url前后手动拼接的单引号,直接传入原始值即可 self.Cursor.execute(FetchQuery, (item['url'], item['text'])) if(self.Cursor.fetchone()[0]== 0): print("Inserting into db...\n") InsertQuery = "INSERT INTO scrappedjobs (URL, JobTitle, JobDescription, CompanyName) VALUES (%s, %s, %s, %s)" self.Cursor.execute(InsertQuery,(item['url'], item['title'], item['text'], item['companyName'])) self.db.commit()
第二步(可选,优化匹配逻辑)
如果修改后仍有偶发匹配失败的问题,建议调整去重逻辑:
- 绝大多数招聘页面的URL是唯一的,直接去掉JobDescription匹配条件,仅用URL做去重判断,性能更高也不会出现匹配误差。
- 如果确实需要校验内容是否更新,可以给爬取到的JobDescription计算MD5哈希值,单独新增一个哈希字段存储,查询时仅匹配哈希值即可,既不会受引号、特殊字符影响,查询效率也比匹配超长字符串高很多。
手动写SQL的转义方法
如果需要在phpMyAdmin中手动测试查询,只需要把字符串里的单引号替换为两个连续单引号即可,不需要转义双引号,示例正确写法:
SELECT COUNT(*) FROM scrappedjobs WHERE JobDescription = '<div class="article__content">......group''s ongoing efforts......</div>'
内容的提问来源于stack exchange,提问作者user16460949
相关产品推荐
相关产品推荐

