【问题标题】:"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1"“您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以获取在第 1 行的 '' 附近使用的正确语法”
【发布时间】:2015-09-20 06:42:22
【问题描述】:

我正在尝试执行插入查询。 当我直接将其复制并粘贴到 mysql 命令提示符时它可以工作,但当我从 Python 执行它时失败。我在 MySQLdb 中遇到此错误(也尝试直接使用 _mysql 并得到相同的错误)。

错误和这个问题一样,但是答案对我的问题不起作用(我的查询在一行上):MySQL the right syntax to use near '' at line 1 error

query = """INSERT INTO %s(%s) VALUES (%f) ON DUPLICATE KEY UPDATE %s=%f"""%(table_name,measurement_type,value,measurement_type,value)
print query 
cur.execute(query)

结果(它打印查询,当直接复制到 MySQL 命令提示符时执行正常,然后崩溃):

INSERT INTO D02CA10B13E5$accelerometer_X(periodic) VALUES (79.000000) ON DUPLICATE KEY UPDATE periodic=79.000000
Traceback (most recent call last):
File "collect_data.py", line 145, in <module>
process_data_array(data_bytes[start:start+sensor_packet_size])
File "collect_data.py", line 105, in process_data_array
record_data(MAC,sensor_name,"X",code_name,X,cur)
File "collect_data.py", line 58, in record_data
cur.execute(query)
File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 174, in execute
self.errorhandler(self, exc, value)
File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
raise errorclass, errorvalue
_mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1")

我尝试打开分析,因为我似乎无法从光标访问 _last_executed(其他人建议)。我的光标似乎没有这个属性(被删除了吗?)。

query = """INSERT INTO %s(%s) VALUES (%f) ON DUPLICATE KEY UPDATE %s=%f"""%(table_name,measurement_type,value,measurement_type,value)
print query 
#cur.execute(query)
try:
    cur.execute(query)
except:
    cur.execute('show profiles')
    for row in cur:
        print row
    cur.execute("set profiling = 0")
    exit()

这显示了一个不完整的查询:

INSERT INTO D02CA10B13E5$accelerometer_X(periodic) VALUES (80.000000) ON DUPLICATE KEY UPDATE periodic=80.000000
(1L, 5.925e-05, 'INSERT INTO D02CA10B13E5')

有些人建议将查询分成多行(这与我在上面发布的链接中的建议相矛盾)。无论如何,它将搜索范围缩小到一行(显然 Python 模块不喜欢我在第三行的表名或列名)

query = "INSERT \nINTO \n%s(%s) \nVALUES \n(%f) \nON \nDUPLICATE \nKEY \nUPDATE %s=%f"%(table_name,measurement_type,value,measurement_type,value)
print query 
cur.execute(query)

结果:

INSERT 
INTO 
D02CA10B13E5$accelerometer_X(periodic) 
VALUES 
(80.000000) 
ON 
DUPLICATE 
KEY 
UPDATE periodic=80.000000
Traceback (most recent call last):
File "collect_data.py", line 145, in <module>
process_data_array(data_bytes[start:start+sensor_packet_size])
File "collect_data.py", line 105, in process_data_array
record_data(MAC,sensor_name,"X",code_name,X,cur)
File "collect_data.py", line 58, in record_data
cur.execute(query)
File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 174, in execute
self.errorhandler(self, exc, value)
File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
raise errorclass, errorvalue
_mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3")

同样,这个查询在 MySQL 上执行得很好,所以我不确定 Python 中发生了什么。任何指针表示赞赏。谢谢!

【问题讨论】:

  • 我怀疑“$”符号。我建议您尝试转义它,(使用“\$”)或者看看如果您在名称中没有“$”的表上运行查询会发生什么。
  • 尝试删除“$”,没有帮助。这是一个允许的模式对象字符:dev.mysql.com/doc/refman/5.0/en/identifiers.html 但是谢谢,值得检查。

标签: python mysql python-2.7 mysql-python


【解决方案1】:

好吧,MySQL 错误中的 '' 显然是指附加到我的表名的 \0 字符。这是不可见的,您可以自己看到:

>>> print chr(0)

>>> print "hello" + chr(0)
hello

\0 字符完全不可见,并且不会从终端复制到剪贴板(因此在粘贴到 MySQL 控制台时它可以工作)。偷偷摸摸!

我通过将字符串长度与预期字符串长度进行比较并发现我肉眼看不到的 1 个字符的差异发现了这一点。当我从套接字读取字符串(传感器 ID)时,\0 字符出现在我的 Python 代码中(另一端的应用程序是附加这些 \0 字符的 C 程序)。

希望我的回答能给别人省很多麻烦!

【讨论】:

    猜你喜欢
    • 2022-01-24
    • 2016-03-04
    • 2022-06-14
    • 2021-08-06
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多