關(guān)于MySQL常見錯誤碼的講解
Error code 1064: Syntax error
假設(shè)有一個sql語句
- select LastName, FirstName,from Person
執(zhí)行的時候會包錯誤
- 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語句有語法錯誤,單看這個錯誤碼,我們無法判斷出具體是哪的錯誤。
- 仔細(xì)看報錯信息的最后,有一段用單引號標(biāo)識的對源sql語句的引用'from Person',這表示的是這段sql語句無法被解析,但是對于我們這個例子,這個報錯引用并沒什么卵用。我們再注意觀察,這個引用的信息前面多了一個逗號,這個逗號后面應(yīng)該接的是個表中的列名,而不是from關(guān)鍵字。
- 1064的錯誤信息一般最后會有個... near '...'格式的信息,near后面的引用就是sql語句開始無法被解析的地方,當(dāng)遇到這個錯誤,多觀察這段無法解析的sql語句前后的字符。
- 有時候,你得到的錯誤信息是... near '',near后面的引用是空的,這表示出錯的地方位于sql語句的開頭或者第一個字符,通常情況是單引號、引號、括號沒有成對出現(xiàn)或者是結(jié)尾處沒有正確的字符,如中文分號。
- 如果發(fā)現(xiàn)了1064錯誤,注意查看報錯信息里引用的sql語句,多查看這個錯誤的sql語句前后部分。
- 如果有人向你詢問1064的sql錯誤,你最好讓他給你提供完整的sql語句和報錯信息。
Error code 1175: Safe Update
這個錯誤是由于你執(zhí)行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默認(rèn)值有關(guān),需查看官方文檔
- 1292/1366 double和integer類型錯誤,檢查語法和數(shù)值類型
- 1292 detatime錯誤,檢查插入的時間數(shù)據(jù)格式,是否超出范圍,帶時區(qū)格式的時間字符串格式是否有問題
- 1292 VARIABLE 檢查你設(shè)置的VARIABLE屬性
- 1292 LOAD DATA 檢查轉(zhuǎn)義字符,檢查數(shù)據(jù)類型
- 1411 STR_TO_DATE 檢查時間字符串格式
1045 Access denied
權(quán)限錯誤,檢查用戶名密碼是否正確,檢查當(dāng)前用戶是否有權(quán)限訪問數(shù)據(jù)。
1236 "impossible position" in Replication
- 通常情況下,這是由于mysql主節(jié)點掛掉了并且sync_binlog=OFF,解決方法是在從節(jié)點設(shè)置 POS=0。
- 當(dāng)sync_binlog=OFF時,主節(jié)點會在把數(shù)據(jù)先發(fā)給從節(jié)點,然后寫binlog。當(dāng)主節(jié)點在寫binlog之前掛掉了,這時候由于已經(jīng)把數(shù)據(jù)發(fā)給從節(jié)點了,所以從節(jié)點在寫完數(shù)據(jù)后,binlog被更新,導(dǎo)致主節(jié)點和從節(jié)點binlog指針位置不一致。所以,當(dāng)主節(jié)點重新啟動后,會開啟一個新的binlog,所以這時候把從節(jié)點的binlog指針位置設(shè)置為0,從頭重新開始。
- 最好的解決方法設(shè)置sync_binlog=ON,這樣基于binlog同步,但會帶來較多的i/o開銷。
24 Can't open file (Too many open files)
open_files_limit是個系統(tǒng)的設(shè)置,table_open_cache必須比系統(tǒng)的這個配置小
1062 - Duplicate Entry
這個錯誤通常有以下幾個原因
主鍵約束,Error Code: 1062. Duplicate entry ‘12’ for key ‘PRIMARY’,主鍵約束的數(shù)據(jù)必須是唯一的,解決的方法之一是設(shè)置主鍵是自增的,這樣,插入數(shù)據(jù)時,設(shè)置主鍵的數(shù)據(jù)為NULL。
唯一屬性約束,Error Code: 1062. Duplicate entry ‘A’ for key ‘code’,這是你設(shè)置了數(shù)據(jù)是唯一的,但插入的數(shù)據(jù)和表中數(shù)據(jù)重復(fù)了,解決的方法是使用INSERT IGNORE代替INSERT,INSERT IGNORE插入數(shù)據(jù)的時候,如果重復(fù)了,就不做任何操作,也不報錯,如果不重復(fù),就和INSERT行為一致,插入數(shù)據(jù)。
126, 127, 134, 144, 145
當(dāng)你訪問數(shù)據(jù)時,可能會遇到這些錯誤。這是錯誤是由于mysql數(shù)據(jù)庫內(nèi)部錯誤引起的。比如:
- 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,被攻擊了,服務(wù)掛了,不正確的關(guān)閉mysql,損壞的數(shù)據(jù)都有可能造成這些問題。當(dāng)這些錯誤發(fā)生時,數(shù)據(jù)就無法訪問了,并且一直永久的無法訪問。所以,最好把數(shù)據(jù)做好備份,如果你沒有備份,可以嘗試去修復(fù)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
這通常意味著客戶端和服務(wù)器之間的字符集處理不一致。
139
錯誤139可能意味著表定義中字段的數(shù)量和大小超過了一些限制。檢查sql語句中異常長的字符串,異常大的整數(shù)等等
2002, 2003 Cannot connect
無法連接,如果服務(wù)正常啟動,檢查以下可能的項目
1、是不是防火墻的問題,關(guān)閉防火墻試試
2、檢查mysql服務(wù)監(jiān)聽的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.
總結(jié)起來意思就是你查詢了結(jié)果,但是卻沒有把結(jié)果獲取下來。造成mysql server一直在等你把結(jié)果取走。
1215: Cannot add foreign key constraint
添加外鍵錯誤,檢查外鍵關(guān)聯(lián)的兩個字段數(shù)據(jù)類型是否一致。