關于MySQL常見錯誤碼的講解
Error code 1064: Syntax error
假設有一個sql語句
- select LastName, FirstName,from Person
執行的時候會包錯誤
- Error Code: 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 'from Person' at line 2.
- 1064錯誤說明你的sql語句有語法錯誤,單看這個錯誤碼,我們無法判斷出具體是哪的錯誤。
- 仔細看報錯信息的最后,有一段用單引號標識的對源sql語句的引用'from Person',這表示的是這段sql語句無法被解析,但是對于我們這個例子,這個報錯引用并沒什么卵用。我們再注意觀察,這個引用的信息前面多了一個逗號,這個逗號后面應該接的是個表中的列名,而不是from關鍵字。
- 1064的錯誤信息一般最后會有個... near '...'格式的信息,near后面的引用就是sql語句開始無法被解析的地方,當遇到這個錯誤,多觀察這段無法解析的sql語句前后的字符。
- 有時候,你得到的錯誤信息是... near '',near后面的引用是空的,這表示出錯的地方位于sql語句的開頭或者第一個字符,通常情況是單引號、引號、括號沒有成對出現或者是結尾處沒有正確的字符,如中文分號。
- 如果發現了1064錯誤,注意查看報錯信息里引用的sql語句,多查看這個錯誤的sql語句前后部分。
- 如果有人向你詢問1064的sql錯誤,你最好讓他給你提供完整的sql語句和報錯信息。
Error code 1175: Safe Update
這個錯誤是由于你執行update或者delete語句時,沒有指定where條件,如果想忽略這個錯誤,則修改配置
- SET SQL_SAFE_UPDATES = 0;
重新打開錯誤提醒
- SET SQL_SAFE_UPDATES = 1;
- 1067, 1292, 1366, 1411 - Bad Value for number, date, default, etc.
- 1067這個錯誤和TINESTAMP默認值有關,需查看官方文檔
- 1292/1366 double和integer類型錯誤,檢查語法和數值類型
- 1292 detatime錯誤,檢查插入的時間數據格式,是否超出范圍,帶時區格式的時間字符串格式是否有問題
- 1292 VARIABLE 檢查你設置的VARIABLE屬性
- 1292 LOAD DATA 檢查轉義字符,檢查數據類型
- 1411 STR_TO_DATE 檢查時間字符串格式
1045 Access denied
權限錯誤,檢查用戶名密碼是否正確,檢查當前用戶是否有權限訪問數據。
1236 "impossible position" in Replication
- 通常情況下,這是由于mysql主節點掛掉了并且sync_binlog=OFF,解決方法是在從節點設置 POS=0。
- 當sync_binlog=OFF時,主節點會在把數據先發給從節點,然后寫binlog。當主節點在寫binlog之前掛掉了,這時候由于已經把數據發給從節點了,所以從節點在寫完數據后,binlog被更新,導致主節點和從節點binlog指針位置不一致。所以,當主節點重新啟動后,會開啟一個新的binlog,所以這時候把從節點的binlog指針位置設置為0,從頭重新開始。
- 最好的解決方法設置sync_binlog=ON,這樣基于binlog同步,但會帶來較多的i/o開銷。
24 Can't open file (Too many open files)
open_files_limit是個系統的設置,table_open_cache必須比系統的這個配置小
1062 - Duplicate Entry
這個錯誤通常有以下幾個原因
主鍵約束,Error Code: 1062. Duplicate entry ‘12’ for key ‘PRIMARY’,主鍵約束的數據必須是唯一的,解決的方法之一是設置主鍵是自增的,這樣,插入數據時,設置主鍵的數據為NULL。
唯一屬性約束,Error Code: 1062. Duplicate entry ‘A’ for key ‘code’,這是你設置了數據是唯一的,但插入的數據和表中數據重復了,解決的方法是使用INSERT IGNORE代替INSERT,INSERT IGNORE插入數據的時候,如果重復了,就不做任何操作,也不報錯,如果不重復,就和INSERT行為一致,插入數據。
126, 127, 134, 144, 145
當你訪問數據時,可能會遇到這些錯誤。這是錯誤是由于mysql數據庫內部錯誤引起的。比如:
- MySQL error code 126 = Index file is crashed
- MySQL error code 127 = Record-file is crashed
- MySQL error code 134 = Record was already deleted (or record file crashed)
- MySQL error code 144 = Table is crashed and last repair failed
- MySQL error code 145 = Table was marked as crashed and should be repaired
mysql的bug,被攻擊了,服務掛了,不正確的關閉mysql,損壞的數據都有可能造成這些問題。當這些錯誤發生時,數據就無法訪問了,并且一直永久的無法訪問。所以,最好把數據做好備份,如果你沒有備份,可以嘗試去修復mysql。如果存儲引擎是MyISAM,使用CHECK TABLE和REPAIR TABLE命令(mysql>=5.7)。
- CHECK TABLE <table name> ////To check the extent of database corruption
- REPAIR TABLE <table name> ////To repair table
1366
這通常意味著客戶端和服務器之間的字符集處理不一致。
139
錯誤139可能意味著表定義中字段的數量和大小超過了一些限制。檢查sql語句中異常長的字符串,異常大的整數等等
2002, 2003 Cannot connect
無法連接,如果服務正常啟動,檢查以下可能的項目
1、是不是防火墻的問題,關閉防火墻試試
2、檢查mysql服務監聽的IP
3、檢查skip-name-resolve
4、檢查socket文件路徑
2014 Commands out of sync; you can't run this command now
這個是由于你運行sql查詢語句的序列不正確造成的,官方的解釋
- This can happen, for example, if you are using mysql_use_result() and try to execute a new query before you have called mysql_free_result(). It can also happen if you try to execute two queries that return data without calling mysql_use_result() or mysql_store_result() in between.
總結起來意思就是你查詢了結果,但是卻沒有把結果獲取下來。造成mysql server一直在等你把結果取走。
1215: Cannot add foreign key constraint
添加外鍵錯誤,檢查外鍵關聯的兩個字段數據類型是否一致。