關于MySQL中savepoint語句使用時所出現(xiàn)的錯誤
前幾天幫同事解決一個案例,在主從復制環(huán)境下,從庫上的MySQL版本號是5.5.5,遇到下面的錯誤:
#其他非相關信息我都隱藏掉了 [(yejr@imysql.com)]> show slave status \G; Slave_IO_Running: Yes Slave_SQL_Running: No Last_Errno: 1064 Last_Error: Error '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 '6e86db84_14847168f19__8000' at line 1' on query. Default database: 'act'. Query: 'SAVEPOINT 6e86db84_14847168f19__8000' Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 1064 Last_SQL_Error: Error '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 '6e86db84_14847168f19__8000' at line 1' on query. Default database: 'act_log'. Query: 'SAVEPOINT 6e86db84_14847168f19__8000'
第一感覺是遇到保留關鍵字了,不過看到這么長的字符串,不應該是保留關鍵字才對。
經(jīng)過嘗試,最后發(fā)現(xiàn)是字符串中的 “e” 這個字符如果存在就可能會報錯,看起來應該是bug才對了。
在MySQL的bug系統(tǒng)里確實找到了這個bug,不過看bug描述,在5.5版本中應該是已經(jīng)修復了才對,看來太不靠譜了呀~~
關于這個bug:Savepoint identifier is occasionally considered as floating point numbers
其實除了升級版本外,解決方法也很簡單,把savepoint后面的 identifier 字符串用反引號(波浪號的下檔鍵,英文叫做 backticks 鍵)引用起來就行。
例如:
savepoint `6e86db84_14847168f19__8000`;
這樣就可以了。
這個案例也提示我們,在寫SQL時,涉及到數(shù)據(jù)庫、表、字段、identifier 等名稱時,最好是都能用反引號引用,確??捎谩?br /> 曾經(jīng)看到線上數(shù)據(jù)表有個字段名是 check ,這個名字在MySQL里很早就已經(jīng)是保留關鍵字,幸好開發(fā)同學比較靠譜,都加上了反引號。
關于savepoint的2個bug:
Savepoint Identifier should be enclosed with backticks
Savepoint identifier is occasionally considered as floating point numbers
相關文章
MySQL數(shù)據(jù)庫中使用REPLACE函數(shù)示例及實際應用
本文詳細介紹了MySQL中的REPLACE函數(shù),包括其基本語法、用法和實際應用場景,REPLACE函數(shù)主要用于替換字符串中的某些子字符串,對大小寫敏感,文章還通過多個示例展示了REPLACE函數(shù)的實際應用,需要的朋友可以參考下2024-10-10
Windows10下mysql 5.7.21 Installer版安裝圖文教程
這篇文章主要為大家詳細介紹了Windows10下mysql 5.7.21 Installer版安裝圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-09-09
設置MySQL中的數(shù)據(jù)類型來優(yōu)化運行速度的實例
這篇文章主要介紹了設置MySQL中索引的數(shù)據(jù)類型來優(yōu)化運行速度的實例,主要是適當使用短字節(jié)的數(shù)據(jù)類型來處理短索引,需要的朋友可以參考下2015-05-05
mysqld_multi在Linux服務器上運行多個MySQL實例
在Linux系統(tǒng)上使用mysqld_multi來啟動和管理多個MySQL實例是一種常見的做法,這種方式允許你在同一臺機器上運行多個MySQL服務,每個服務可以有不同的配置和數(shù)據(jù)目錄,這篇文章展示如何設置和使用mysqld_multi來啟動多個MySQL實例2025-02-02

