mysql query error DZ程序出现mysql query error解决方法
|mysql query error翻译成中文的意思是:MySQL查询错误
最直接简单的方法是:
到数据库高级管理,也就是PHPMYADMIN里面,全选数据库点击修复即可,如果你不知道数据库怎么进或者PHPMYADMIN怎么进,联系你的空间商或者懂的朋友,让他帮你修复即可解决。
今天discuz论坛出现问题,如下:
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 搜索此错误的解决方案
按照个人经验,这是第一次遇到的问题,应该跟临时目录tmp有关。
操起g.cn开始搜索,得出理论性结果如下:
- 该问题也会发生在windows服务器上(C:\WINDOWS\TEMP\MY32),亦是跟临时目录有关
- 该问题跟论坛采用“首页四格”插件有关
解决方法如下:
- 采用phpmyadmin对出问题的表进行repair(修复),独立主机亦可用mysql工具修复
- 采用discuz tools进行数据库修复(链接:TOOLS 2009贺岁版)
而实际操作中,我先采用了重启服务器(自有vps服务器,linux系统),系统启动完成后依次启动php-cgi、nginx、mysql,重新打开论坛,一切正常。过了2个小时,论坛又出现那个问题,从问题上看是写入数据出错。检查临时目录权限,一切正常。不经意间想起这个vps只有5G空间,linux系统占用1.5G,该论坛图片甚多,莫非……
键入如下命令:
[root@centos www]# df -m
Filesystem 1M-blocks Used Available Use% Mounted on
/dev/sda1 5040 4784 0 100% /
看来是服务器空间被吃完了!马上删除一些没用的数据,估计是这几天论坛图片又传了好多,导致空间吃紧了!下一步就要去升级该vps了!硬件问题,这也实在不是我能解决的了!
而网上搜索来的答案中也并非没有用,比如修复表的操作,看到得出错是某个表出现问题提示需要修复,如下:
Error: Table '.\discuz\[Table]threads' is marked as crashed and should be repaired
而经过phpmyadmin无法修复的话,可以考虑上传discuz官方的tools进行修复试试看。当然,一切操作记得尽可能做个备份,以防万一!
可以看到,问题出在connect函数,即连接问题。
出现数据库连接问题,一般是这几种情况:
- 数据库服务没有起来
- 数据库配置没有配置正确
检查数据库服务状态
直接执行service mysql status
可以看到mysql服务的运行状态,如果看到下面的结果,说明数据库没有起来,请手动重启数据库。
曾经出现过某些同学,不小心将/etc/hosts
中localhost
解析到127.0.0.1
的那行删掉了,而config.inc.php
中host
的配置是localhost
,导致php链接数据库的时候,无法解析localhost
,导致连接失败。大家也可以看看
解决办法:
如果您的服务器是独立主机强烈建议使用命令行方式进行修复:
修复前将mysql服务停止。
如果是Win主机,打开命令行方式,然后进入到mysql的/bin目录。
执行myisamchk -r d:\mysql\data\discuz\*.MYI
其中d:\mysql\data\discuz\换成您的数据库所在路径。
如果是类Unix主机,直接使用myisamchk -r 数据库目录\*.MYI
即可。
大概说一下检查的方法
检查语法错误,可以用echo输出变量,看看你要插入的数据是否出现问题
用mysql_error检查sql语句执行错误,echo出来
检查数据库建立的是否正确,是否和插入语句一一对应,NOT NULL部分要注意
检验mysql_query($sql,$conn);的返回值,echo出来,看看是否正常
如果以上方法都找不出来,还有可能是
你电脑里装了多个mysql,端口改过吗(比如你之前学习mysql,安装了一个,后来又安装一个wamp学php,那这两个端口可能会冲突,检查一下,在配置文件my.ini里Ctrl+F查找3306或者port,把端口全改掉,这个时候你的php的配置文件php.ini里还有一个默认访问端口mysql.default_port = 3306,也改掉)
真的没有成功吗?一般mysql数据库操作是用mysql_affected_rows()来检测操作是否成功把。
如果确定数据库中没有这条数据,在mysql里直接操作没问题说明表名和列名没问题,但库名确定没弄错吗?
字符编码不对,插入数据应该只会是乱码,也不会插不进去。
数据没重复吧= =
真的没有成功吗?一般mysql数据库操作是用mysql_affected_rows()来检测操作是否成功把。
如果确定数据库中没有这条数据,在mysql里直接操作没问题说明表名和列名没问题,但库名确定没弄错吗?
字符编码不对,插入数据应该只会是乱码,也不会插不进去。
数据没重复吧= =
1,你的数据库建立了吗?表建立了吗?
2,表字段与插入数据相符吗?
3,字段类型和插入数据的类型一致吗?
4,sql语句规范吗?
个人觉得3和4的可能性是比较大的,regdate如果也是字符串类型的话,你的new()就必须加单引号了。这里没有看到你建立的数据表的数据。单纯只是一个插入失败,反而看不到问题所在,“插入失败”过于笼统。
我在“UTF8字符集的表怎么直接转UTF8MB4”一文中介绍了如何把表字符集由UTF8直接转换成UTF8MB4的几种方法。
1、只修改字符集(使用默认校验集)
yejr@imysql.com> alter table t1 convert to character set utf8mb4
2、同时修改表字符集和校验集
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、同时修改某列的字符集和校验集
yejr@imysql.com> alter table t1 modify c1 varchar(20) character set utf8mb4 collate utf8mb4_unicode_ci not null default ‘’
好了,有个字符集为UTF8MB4的表中想存储各类不同字符集的文本,有哪些注意事项亿避免乱码?
如果是通过WEB接口存储数据,则建议在browser端、server端全都采用UTF8字符集,MySQL Server端采用UTF8/UTF8MB4均可(针对大多数文本,其实UTF8字符集就足够存储的了)。
0 Comments.