mysql query error DZ程序出現(xiàn)mysql query error解決方法
mysql query error翻譯成中文的意思是:MySQL查詢錯(cuò)誤
最直接簡(jiǎn)單的方法是:
到數(shù)據(jù)庫(kù)高級(jí)管理,也就是PHPMYADMIN里面,全選數(shù)據(jù)庫(kù)點(diǎn)擊修復(fù)即可,如果你不知道數(shù)據(jù)庫(kù)怎么進(jìn)或者PHPMYADMIN怎么進(jìn),聯(lián)系你的空間商或者懂的朋友,讓他幫你修復(fù)即可解決。
今天discuz論壇出現(xiàn)問(wèn)題,如下:
Discuz! info: MySQL Query Error
Time: 2009-9-14 4:30pm
Script: /bbs/index.php
SQL: SELECT t.*, f.name FROM [Table]threads t, [Table]forums f WHERE t.fid<>'0' AND f.fid=t.fid AND f.fid not in (125) AND t.displayorder not in (-1,-2) ORDER BY t.dateline DESC LIMIT 0, 10
Error: Error writing file '/tmp/MYAmg92O' (Errcode: 28)
Errno.: 3
到 http://faq.comsenz.com 搜索此錯(cuò)誤的解決方案
按照個(gè)人經(jīng)驗(yàn),這是第一次遇到的問(wèn)題,應(yīng)該跟臨時(shí)目錄tmp有關(guān)。
操起g.cn開(kāi)始搜索,得出理論性結(jié)果如下:
- 該問(wèn)題也會(huì)發(fā)生在windows服務(wù)器上(C:\WINDOWS\TEMP\MY32),亦是跟臨時(shí)目錄有關(guān)
- 該問(wèn)題跟論壇采用“首頁(yè)四格”插件有關(guān)
解決方法如下:
- 采用phpmyadmin對(duì)出問(wèn)題的表進(jìn)行repair(修復(fù)),獨(dú)立主機(jī)亦可用mysql工具修復(fù)
- 采用discuz tools進(jìn)行數(shù)據(jù)庫(kù)修復(fù)(鏈接:TOOLS 2009賀歲版)
而實(shí)際操作中,我先采用了重啟服務(wù)器(自有vps服務(wù)器,linux系統(tǒng)),系統(tǒng)啟動(dòng)完成后依次啟動(dòng)php-cgi、nginx、mysql,重新打開(kāi)論壇,一切正常。過(guò)了2個(gè)小時(shí),論壇又出現(xiàn)那個(gè)問(wèn)題,從問(wèn)題上看是寫入數(shù)據(jù)出錯(cuò)。檢查臨時(shí)目錄權(quán)限,一切正常。不經(jīng)意間想起這個(gè)vps只有5G空間,linux系統(tǒng)占用1.5G,該論壇圖片甚多,莫非……
鍵入如下命令:
[root@centos www]# df -m
Filesystem?????????? 1M-blocks????? Used Available Use% Mounted on
/dev/sda1???????????????? 5040????? 4784???????? 0 100% /
看來(lái)是服務(wù)器空間被吃完了!馬上刪除一些沒(méi)用的數(shù)據(jù),估計(jì)是這幾天論壇圖片又傳了好多,導(dǎo)致空間吃緊了!下一步就要去升級(jí)該vps了!硬件問(wèn)題,這也實(shí)在不是我能解決的了!
而網(wǎng)上搜索來(lái)的答案中也并非沒(méi)有用,比如修復(fù)表的操作,看到得出錯(cuò)是某個(gè)表出現(xiàn)問(wèn)題提示需要修復(fù),如下:
Error: Table '.\discuz\[Table]threads' is marked as crashed and should be repaired
而經(jīng)過(guò)phpmyadmin無(wú)法修復(fù)的話,可以考慮上傳discuz官方的tools進(jìn)行修復(fù)試試看。當(dāng)然,一切操作記得盡可能做個(gè)備份,以防萬(wàn)一!
可以看到,問(wèn)題出在connect函數(shù),即連接問(wèn)題。
出現(xiàn)數(shù)據(jù)庫(kù)連接問(wèn)題,一般是這幾種情況:
- 數(shù)據(jù)庫(kù)服務(wù)沒(méi)有起來(lái)
- 數(shù)據(jù)庫(kù)配置沒(méi)有配置正確
檢查數(shù)據(jù)庫(kù)服務(wù)狀態(tài)
直接執(zhí)行service mysql status
可以看到mysql服務(wù)的運(yùn)行狀態(tài),如果看到下面的結(jié)果,說(shuō)明數(shù)據(jù)庫(kù)沒(méi)有起來(lái),請(qǐng)手動(dòng)重啟數(shù)據(jù)庫(kù)。
曾經(jīng)出現(xiàn)過(guò)某些同學(xué),不小心將/etc/hosts
中localhost
解析到127.0.0.1
的那行刪掉了,而config.inc.php
中host
的配置是localhost
,導(dǎo)致php鏈接數(shù)據(jù)庫(kù)的時(shí)候,無(wú)法解析localhost
,導(dǎo)致連接失敗。大家也可以看看
解決辦法:
如果您的服務(wù)器是獨(dú)立主機(jī)強(qiáng)烈建議使用命令行方式進(jìn)行修復(fù):
修復(fù)前將mysql服務(wù)停止。
如果是Win主機(jī),打開(kāi)命令行方式,然后進(jìn)入到mysql的/bin目錄。
執(zhí)行myisamchk -r d:\mysql\data\discuz\*.MYI
其中d:\mysql\data\discuz\換成您的數(shù)據(jù)庫(kù)所在路徑。
如果是類Unix主機(jī),直接使用myisamchk -r 數(shù)據(jù)庫(kù)目錄\*.MYI
即可。
大概說(shuō)一下檢查的方法
檢查語(yǔ)法錯(cuò)誤,可以用echo輸出變量,看看你要插入的數(shù)據(jù)是否出現(xiàn)問(wèn)題
用mysql_error檢查sql語(yǔ)句執(zhí)行錯(cuò)誤,echo出來(lái)
檢查數(shù)據(jù)庫(kù)建立的是否正確,是否和插入語(yǔ)句一一對(duì)應(yīng),NOT NULL部分要注意
檢驗(yàn)mysql_query($sql,$conn);的返回值,echo出來(lái),看看是否正常
如果以上方法都找不出來(lái),還有可能是
你電腦里裝了多個(gè)mysql,端口改過(guò)嗎(比如你之前學(xué)習(xí)mysql,安裝了一個(gè),后來(lái)又安裝一個(gè)wamp學(xué)php,那這兩個(gè)端口可能會(huì)沖突,檢查一下,在配置文件my.ini里Ctrl+F查找3306或者port,把端口全改掉,這個(gè)時(shí)候你的php的配置文件php.ini里還有一個(gè)默認(rèn)訪問(wèn)端口mysql.default_port = 3306,也改掉)
真的沒(méi)有成功嗎?一般mysql數(shù)據(jù)庫(kù)操作是用mysql_affected_rows()來(lái)檢測(cè)操作是否成功把。
如果確定數(shù)據(jù)庫(kù)中沒(méi)有這條數(shù)據(jù),在mysql里直接操作沒(méi)問(wèn)題說(shuō)明表名和列名沒(méi)問(wèn)題,但庫(kù)名確定沒(méi)弄錯(cuò)嗎?
字符編碼不對(duì),插入數(shù)據(jù)應(yīng)該只會(huì)是亂碼,也不會(huì)插不進(jìn)去。
數(shù)據(jù)沒(méi)重復(fù)吧= =
真的沒(méi)有成功嗎?一般mysql數(shù)據(jù)庫(kù)操作是用mysql_affected_rows()來(lái)檢測(cè)操作是否成功把。
如果確定數(shù)據(jù)庫(kù)中沒(méi)有這條數(shù)據(jù),在mysql里直接操作沒(méi)問(wèn)題說(shuō)明表名和列名沒(méi)問(wèn)題,但庫(kù)名確定沒(méi)弄錯(cuò)嗎?
字符編碼不對(duì),插入數(shù)據(jù)應(yīng)該只會(huì)是亂碼,也不會(huì)插不進(jìn)去。
數(shù)據(jù)沒(méi)重復(fù)吧= =
1,你的數(shù)據(jù)庫(kù)建立了嗎?表建立了嗎?
2,表字段與插入數(shù)據(jù)相符嗎?
3,字段類型和插入數(shù)據(jù)的類型一致嗎?
4,sql語(yǔ)句規(guī)范嗎?
個(gè)人覺(jué)得3和4的可能性是比較大的,regdate如果也是字符串類型的話,你的new()就必須加單引號(hào)了。這里沒(méi)有看到你建立的數(shù)據(jù)表的數(shù)據(jù)。單純只是一個(gè)插入失敗,反而看不到問(wèn)題所在,“插入失敗”過(guò)于籠統(tǒng)。
我在“UTF8字符集的表怎么直接轉(zhuǎn)UTF8MB4”一文中介紹了如何把表字符集由UTF8直接轉(zhuǎn)換成UTF8MB4的幾種方法。
1、只修改字符集(使用默認(rèn)校驗(yàn)集)
yejr@imysql.com> alter table t1 convert to character set utf8mb4
2、同時(shí)修改表字符集和校驗(yàn)集
yejr@imysql.com> alter table t1 convert to character set utf8mb4 collate utf8mb4_bin;
3、只修改某列的字符集
yejr@imysql.com> alter table t1 modify c1 varchar(20) character set utf8mb4 not null default ‘’
4、同時(shí)修改某列的字符集和校驗(yàn)集
yejr@imysql.com> alter table t1 modify c1 varchar(20) character set utf8mb4 collate utf8mb4_unicode_ci not null default ‘’
好了,有個(gè)字符集為UTF8MB4的表中想存儲(chǔ)各類不同字符集的文本,有哪些注意事項(xiàng)億避免亂碼?
如果是通過(guò)WEB接口存儲(chǔ)數(shù)據(jù),則建議在browser端、server端全都采用UTF8字符集,MySQL Server端采用UTF8/UTF8MB4均可(針對(duì)大多數(shù)文本,其實(shí)UTF8字符集就足夠存儲(chǔ)的了)。
0 Comments.