SQL中GREATEST(CEILING())函数参数传递类型转换问题求助
解决MySQL Connector传递浮点数参数的类型错误问题
直接拼接浮点数到SQL语句里会触发类型错误,而且这种做法存在SQL注入风险,正确的做法是使用MySQL Connector的参数化查询功能,让驱动自动处理类型转换。
正确写法1:使用位置占位符 %s
import mysql.connector conn = mysql.connector.connect() cur = conn.cursor() Wt1 = 7.02 Wt2 = 5.4 # 用%s作为参数占位符,第二个参数传参数元组 cur.execute( 'SELECT GREATEST(CEILING(Tot_Weight + %s), %s) FROM TestTable ORDER BY id ASC;', (Wt1, Wt2) ) print(cur.fetchall())
正确写法2:使用命名参数(可读性更好)
import mysql.connector conn = mysql.connector.connect() cur = conn.cursor() Wt1 = 7.02 Wt2 = 5.4 # 用%(参数名)s作为占位符,第二个参数传参数字典 cur.execute( 'SELECT GREATEST(CEILING(Tot_Weight + %(wt1)s), %(wt2)s) FROM TestTable ORDER BY id ASC;', {'wt1': Wt1, 'wt2': Wt2} ) print(cur.fetchall())
为什么之前的写法不行?
你之前尝试直接拼接浮点数和字符串,即使把Wt1转成str(Wt1),虽然能解决类型错误,但会带来两个问题:
- 浮点数转字符串可能出现格式问题(比如
7.02变成7.020000000000001),导致SQL计算异常; - 存在SQL注入漏洞,如果参数来自用户输入,恶意输入会直接执行危险SQL语句。
内容的提问来源于stack exchange,提问作者user1335606
相关产品推荐
相关产品推荐

