mysqldb的Warning: Truncated wrong DOUBLE value error的原因是啥?
Posted
技术标签:
【中文标题】mysqldb的Warning: Truncated wrong DOUBLE value error的原因是啥?【英文标题】:What is the cause of mysqldb's Warning: Truncated incorrect DOUBLE value error?mysqldb的Warning: Truncated wrong DOUBLE value error的原因是什么? 【发布时间】:2012-07-31 14:52:15 【问题描述】:我收到许多相同类型的警告 --
Warning: Truncated incorrect DOUBLE value: '512121500B'
--但不知道为什么。
mysql 表 dr_snapshot 如下所示:
PremiseID char(10) Primary Key
cycle SMALLINT(6)
last_read DATETIME
reading INTEGER
DeviceID INTEGER
我想按 PremiseID 删除许多行。这是一个特别的:'512121500B'。
这是我通过 PremiseID 删除的 Python 函数:
def delDrSnapRow(premiseID, db):
sql_cmd = " ".join([
"delete ",
"from dr_snapshot ",
"where PremiseID = " + str(premiseID) + " ; "])
del_cur = db.cursor()
rc = del_cur.execute(sql_cmd)
del_cur.close()
return rc
PremiseID 是一个字符串,而不是双精度。我在这里错过了什么?
非常感谢。
编辑
在修改我的删除过程以使用 try: .. 之后,我没有看到警告。我相信我没有看到警告,因为我没有看到警告显示 -- print(e)
-- 在 except 部分。
我得出的结论是 try: except 以某种方式消除了错误。
def delDrSnapRow(premiseID, db):
sql_cmd = " ".join([
"delete ",
"from dr_snapshot ",
"where PremiseID = " + "'" + premiseID + "' ; "])
del_cur = db.cursor()
try:
rc = del_cur.execute(sql_cmd)
except MySQLdb.Error, e:
print "Error %d: %s" % (e.args[0], e.args[1])
except MySQLdb.Warning, e:
print(e)
rc = del_cur.execute(sql_cmd)
del_cur.close()
return rc
【问题讨论】:
您确定是try:except
删除了错误而不是引号?
【参考方案1】:
看看这行"where PremiseID = " + str(premiseID) + " ; "])"
。比较发生在不同的类型上,当 MySQL 比较不同的数据类型时,它们在比较之前在内部被强制转换为 DOUBLE。因此,您可以尝试使用单引号或强制转换来解决问题。所以解决问题的不是try catch,而是引号。
【讨论】:
【参考方案2】:不要滚动你自己的查询字符串生成器,它会导致各种问题。使用 Python SQL 库的内置查询构造语法。如果您至少使用 MySQLdb,您应该能够执行以下操作:
rc = del_cur.execute('delete from dr_snapshot where PremiseID = %s', (premiseID,))
【讨论】:
SQL 语句似乎不是问题。【参考方案3】:我相信你忘记了引号:
sql_cmd = " ".join([
"delete ",
"from dr_snapshot ",
"where PremiseID = '" + premiseID + "' ; "])
但我强烈建议您不要像@sr2222 解释的那样以这种方式执行 sql 语句。
【讨论】:
我刚看了,单引号在prematureID周围。此外,我还可以从 SO 答案中创建 SQL 语句。以上是关于mysqldb的Warning: Truncated wrong DOUBLE value error的原因是啥?的主要内容,如果未能解决你的问题,请参考以下文章