簡體   English   中英

“你的SQL語法有錯誤; 查看與您的MySQL服務器版本對應的手冊,以便在''第1行'附近使用正確的語法

[英]“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”

我正在嘗試執行插入查詢。 它直接復制並粘貼到mysql命令提示符時有效,但是當我從Python執行它時失敗。 我在使用MySQLdb時遇到此錯誤(也嘗試直接使用_mysql並獲得相同的錯誤)。

錯誤與此問題相同,但答案對我的問題不起作用(我的查詢在一行上): MySQL在''第1行錯誤附近使用正確的語法

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中發生了什么。 任何指針都表示贊賞。 謝謝!

好的,所以''在MySQL錯誤中顯然是指一個附加到我的表名的\\ 0字符。 這是不可見的,因為你可以看到自己:

>>> print chr(0)

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

\\ 0字符是完全不可見的,不會從終端復制到剪貼板上(因此粘貼到MySQL控制台時它可以工作)。 偷偷摸摸的!

我通過比較字符串長度和預期的字符串長度並找到1個字符的差異來發現這一點,這個字符對我來說是不可見的。 當我從套接字讀取字符串(傳感器ID)時,我的Python代碼中出現了\\ 0字符(另一端的應用程序是附加了這些\\ 0字符的C程序)。

希望我的回答能給別人帶來很多麻煩!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM