Python &引用;您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以了解使用near'';在第1行“;

Python &引用;您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以了解使用near'';在第1行“;,python,mysql,python-2.7,mysql-python,Python,Mysql,Python 2.7,Mysql Python,我正在尝试执行一个插入查询当我直接复制并粘贴到mysql命令提示符时,它会工作,但当我从Python执行它时,它会失败。我在MySQLdb中遇到了这个错误(也尝试直接使用_mysql,得到了相同的错误) 错误与此问题相同,但答案不适用于我的问题(我的查询位于一行): 结果(它打印查询,当直接复制到MySQL命令提示符时,查询执行良好,然后崩溃): 这显示了一个不完整的查询: INSERT INTO D02CA10B13E5$accelerometer_X(periodic) VALUES (80

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

错误与此问题相同,但答案不适用于我的问题(我的查询位于一行):

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

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

INSERT INTO D02CA10B13E5$accelerometer_X(periodic) VALUES (80.000000) ON DUPLICATE KEY UPDATE periodic=80.000000
(1L, 5.925e-05, 'INSERT INTO D02CA10B13E5')
一些人建议将查询分成多行(这与我在上面发布的链接中的建议相矛盾)。无论如何,它将搜索范围缩小到一行(显然Python模块不喜欢第三行的表名或列名)

结果:

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")
插入
进入
D02CA10B13E5$加速计(周期性)
价值观
(80.000000) 
在…上
复制品
钥匙
定期更新=80.000000
回溯(最近一次呼叫最后一次):
文件“collect_data.py”,第145行,在
处理数据数组(数据字节[开始:开始+传感器数据包大小])
文件“collect_data.py”,第105行,进程中的数据数组
记录数据(MAC,传感器名称,“X”,代码名称,X,电流)
文件“collect_data.py”,第58行,记录_数据
当前执行(查询)
文件“/usr/lib/python2.7/dist packages/MySQLdb/cursors.py”,执行中的第174行
errorhandler(self、exc、value)
文件“/usr/lib/python2.7/dist packages/MySQLdb/connections.py”,第36行,在defaulterrorhandler中
提高errorclass,errorvalue
_mysql_exceptions.ProgrammingError:(1064,“您的SQL语法有错误;请查看与您的mysql服务器版本对应的手册,以了解第3行“”附近使用的正确语法”)
同样,这个查询在MySQL上执行得很好,所以我不确定Python中发生了什么。任何指点都很感激。谢谢

Ok所以MySQL错误中的“”显然是指附加到我的表名中的\0字符。这是不可见的,因为您自己可以看到:

>>> print chr(0)

>>> print "hello" + chr(0)
hello
\0字符是完全不可见的,不会从终端复制到剪贴板上(因此粘贴到MySQL控制台时它可以工作)。鬼鬼祟祟的

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

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

我怀疑“$”符号。我建议您尝试转义它(使用“\$”),或者查看如果在名称中没有“$”的表上运行查询会发生什么情况。尝试删除“$”,没有帮助。这是一个允许的模式对象字符:但谢谢,值得检查。
INSERT INTO D02CA10B13E5$accelerometer_X(periodic) VALUES (80.000000) ON DUPLICATE KEY UPDATE periodic=80.000000
(1L, 5.925e-05, 'INSERT INTO D02CA10B13E5')
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")
>>> print chr(0)

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