You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 10:00:21