如何在Python代码中调用MySQL自定义函数?加密数据查询失败求助
问题解决:加密数据查询无结果及Python调用MySQL自定义函数方法
一、查询无结果的问题修复
1. 函数名不匹配
你的SQL语句中调用的函数是clean_embedefunction,但实际定义的函数是clean_embede,名称不一致会导致SQL无法找到对应函数,这是核心问题之一。修正SQL中的函数名:
query = "SELECT Month,Utility_Number,Name FROM smart_data WHERE clean_embede(Name) like '%{}%';".format(SCKHAindexName)
2. 逻辑对齐问题
clean_embede函数的逻辑是跳过索引为4的倍数(0、4、8...)的字符,需确认两点:
- 数据库中
Name字段的存储值,是否是对应加密逻辑生成的?如果加密逻辑和函数处理逻辑不匹配,处理后的值自然无法匹配搜索关键词。 - 搜索关键词
SCKHAindexName的处理逻辑是否和数据库字段的处理逻辑对齐?比如:若clean_embede是解密函数,数据库存的是密文,那用明文关键词匹配解密后的结果是对的;但如果函数是加密逻辑,就需要先把关键词加密再去匹配。
3. 修复Python函数缩进错误
原函数存在缩进错误,会导致无法正常执行,修正后代码:
def clean_embede(encrypt): word = '' for i, v in enumerate(encrypt): if i % (3 + 1) == 0: continue word += v return word
二、Python中调用MySQL自定义函数的正确方式
方式1:直接在SQL中调用(推荐)
先在MySQL中创建与Python逻辑一致的自定义函数:
DELIMITER // CREATE FUNCTION clean_embede(encrypt VARCHAR(255)) RETURNS VARCHAR(255) DETERMINISTIC BEGIN DECLARE word VARCHAR(255) DEFAULT ''; DECLARE i INT DEFAULT 0; DECLARE len INT; SET len = CHAR_LENGTH(encrypt); WHILE i < len DO IF i % 4 != 0 THEN SET word = CONCAT(word, SUBSTRING(encrypt, i+1, 1)); END IF; SET i = i + 1; END WHILE; RETURN word; END // DELIMITER ;
然后用Python的MySQL驱动(如pymysql)执行查询,必须用参数化查询避免SQL注入:
import pymysql # 建立数据库连接 conn = pymysql.connect(host='你的主机地址', user='用户名', password='密码', db='数据库名') cursor = conn.cursor() search_key = SCKHAindexName # 用参数化方式构造查询 query = "SELECT Month,Utility_Number,Name FROM smart_data WHERE clean_embede(Name) LIKE %s;" cursor.execute(query, ('%' + search_key + '%',)) # 获取并处理结果 results = cursor.fetchall() for row in results: print(row) # 关闭连接 cursor.close() conn.close()
方式2:Python本地处理后查询
如果不在MySQL中创建函数,可先在Python中处理搜索关键词,再查询数据库(此方式无法利用索引,大表查询效率低):
processed_key = clean_embede(SCKHAindexName) query = "SELECT Month,Utility_Number,Name FROM smart_data WHERE Name LIKE %s;" cursor.execute(query, ('%' + processed_key + '%',))
关键注意事项
- 禁止直接拼接SQL:永远不要用
format直接拼接用户输入到SQL语句中,必须用参数化查询防止SQL注入。 - 逻辑一致性:如果同时在Python和MySQL中定义函数,必须保证两者的处理逻辑完全一致,否则会出现结果不匹配的问题。
内容的提问来源于stack exchange,提问作者Msama
相关产品推荐
相关产品推荐

