关闭

有没有人曾告诉你,你的SQL又报错了?

发表于:2016-2-29 09:45

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:等你归去来    来源:51Testing软件测试网采编

  正题二、如何解决问题?
  其实前面我已经说了,既然已经找到问题根源了,要解决问题只是个短时间问题,但是,我还是将给出一些解决方案作参考,毕竟,大家都这么忙,哪有时间破解你那烂代码!如下是一经常会出现的错误:
  1. 报错:[2002] 由于目标计算机积极拒绝,无法连接。解析:数据库连接信息错误,你可能把测试环境连接部署到线上去了,这问题大发了,赶紧恢复吧? 附注:如果没有报错是因为你线上机器可以连接测试库,那问题也大发了;
  2. 报错:[1146] Table ‘bbbq’ doesn’t exist。解析:表不存在,赶紧查查,是不是本次新加的表没有被添加到线上吧,或者表名写错了? 附注:一般过了测试的不太可能是表名写错了;
  3. 报错:[1054] Unknown column ‘column_x’ in ‘field list’。解析:指定的列不存在,要么库中没有,要么写错了,赶紧查! 附注: 同上;
  4. 报错:[1366] Incorrect string value: ‘xA9x96′ for column ‘x_name’ at row 1。解析:字符集问题,如一个gbk的字被字段设置为gb2312接收则会出现此问题,赶紧改回来吧!附注:请尽量使用utf-8编码,代码与入库都方便;
  5. 报错:[1364] Field ‘pid’ doesn’t have a default value。解析:指定字段没有默认值,请确认应该获取到的值是否未获取从而为null,为某些不必要字段指定数据库默认值。   附注: 如有索引关系,请一定设置not null 选项,否则索引将可能失效;
  6. 报错:[1366] Incorrect integer value: ” for column ‘townId’ at row 1。解析:给定的值不符合字段类型要求,在入库之前先确认该字段需要什么类型,可做相应强制转换,再入库。  附注:某些版本的mysql可以自行强制转换类型处理此问题,但是结果可能已经超出你的预期;
  7. LOAD DATA INFILE ,从文件直接导入数据到数据库
  7.1. 报错:[2] File ‘D:/wamp/www/a/area.csv’ not found (Errcode: 2)。解析:找不到指定的csv文件,确认目录位置是否给定正确,如果正确,确认该文件是否为动态生成而目前尚未生成。  附注:小问题;
  7.2. 报错:[13] Can’t get stat of ‘/opt/app/mysql5/var/D:/wamp/www/a/area.csv’ (Errcode: 2)或者提示没有权限操作数据库。解析:数据库与web不在同一台服务器,需要指定关键字LOCAL,从而将web与数据库分开。  附注:LOCAL参数是在必要时候使用,因为不指定LOCAL的操作将看起来更安全;
  7.3. 报错:[1366] Incorrect integer value: ‘北京’ for column ‘provinceId’ at row 1。解析:这里使用不指定字段的方式插入数据库,因此,如果csv文件的值顺序与数据库字段顺序不对应的话,将会有很多类似的报错,而这则是致命的,因为全部都错了,即使偶有个别正确入库的,那也是错的你也不会想要的结果,请以正确的顺序写入csv文件或者指定字段;  附注:这里的1366 与前面的1366 意义是不一样的;
  7.4. 示例LOAD:  LOAD DATA LOCAL INFILE ‘D:/wamp/www/a/area.csv’ REPLACE INTO TABLE `address` CHARACTER SET utf8  FIELDS TERMINATED BY ‘,’ (`provinceId`, `provinceName`, `cityId`, `cityName`, `areaId`, `areaName`, `townId`, `townName`);  附注:要求每个字段都是有值的,即几个字段就要几个’,';
  8. [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 ‘LIMIT 0, 1000′ at line 1。解析:好吧,这是个最通用的错误解释,就是说你的语法写错了。比如 where a_id= order by id desc;这里你原本是想获取一个ID然后去查询,但是后面的ID得到空值,所以整个语法就错了。其实,如果是直接接收参数去查询,这本身可能报错,也是一个注入点,请一定要处理传入的值,一般要求’='号后给”号,整型参数用intval()格式化等等安全意识!
  9. 讲解:REPLACE与INSERT 功能其实是差不多的(唯一键是必须的),但是REPLACE会在数据库中存在此记录时先删除再插入,如有自增ID,将会被迅速变大,从而不必手动执行删除操作,而INSERT重复数据时则将报错(可配合UPDATE使用)。适当使用两个功能,解决问题!
  …
  在真实开发中,其实遇到很多有意思的问题,但一时间也难以想起来,想起来再补充,你也可以下方回复你遇到的问题及解决方案,大家一起参考!
22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号