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

  引语:线上运行的真实环境总是变幻莫测,明明你在本地测试的时候各种情况都是OK得不要不要的,也许你还在为自己某个地方炫酷的效果以及神奇的设计感到激动不已!但是,到线上以后,就偶尔会跟抽风一样,会有人跟你,这里出问题了,那里出问题了!我就纳闷了,怎么可能出问题呢?哈哈,这也许就是大多数攻城狮们最经常发出的感叹吧!

  那么,今天我们就来聊聊怎样发现你的错误以及解决一些错误的快速定位方法,而不是等到用户来你这里反馈,因为那时候可能已经错太久了!我们要做的,应该是将错误发现在第一时间,解决在萌芽之中,作出事后总结以避免以后再犯类似错误!因为,错不可怕,可怕的是一直犯同样的错误,那样的话,你和新手有何差别?

  说明几点:

    1. 本文主要解决问题的SQL相关的错误;

    2. 本文以PHP微视角出发;(妈蛋,谁叫我是从事PHP开发呢?)

    3. 本文解决的问题为,一、如何发现问题;二、如何解决问题;

    4. 欢迎质疑、补充;

  正题一、如何发现问题?

    测试什么的那就不用说了,谁TM敢不过测试就直接上线?如果真是那样,我只能说,你牛逼!测试是一道很重要的防线保障,一般来说,经过测试后的功能,上线之后,Bug不会太多,或者说不会太明显!好吧,我就假设测试一个问题都没有发现,那么, 我们就上线吧!其实,上线之后,我们心里是没有底的,尤其是在某些还没有一套完善的部署系统的时候,上线前和上线后总会出各种稀奇古怪。到底开发和用户是两个层面的人,鬼知道会发生什么呢?我们悬着的一颗心,竟然要完全依赖于用户的操作,用户的反馈?噢,不,那样,太被动了!

    主动发现问题。  一、上线之后,你也不可能再进行测试了,你现在就是一个普通用户,那么,你自己去操作就是必须的,一个大概走下来,基本功能可以确定了,Ok,接下来,真正交给用户!  二、如果没有后手,就真的完全交给用户,那你还是太Low了,因为,必要的监控措施是一定要有的!这里指的监控是程序级别的,也就是所谓的报错。怎样记录报错信息?怎样知道报错了?都说了嘛,我是从事PHP开发的。PHP中有一个记录错误日志的功能,error_reporting,把这个给打开,指定错误日志位置,级别,就可以记录PHP的错误了,但是一定要关闭错误的页面显示,否则,用户看到此类错误,你就完蛋了!既然本文说的是SQL错误,那不应该是这里,没错。但是我要说的是,当SQL报错的时候,PHP也已经发出报错了,通常是一个警告级别的错误,而且这种错误往往是关联性的发生,如下面的语句依赖于上面的查询,而上面已经报错,那么后续也会跟着报错。PHP知道错误了,但是只是大概,那SQL具体哪里错了?只有他自己知道,这种记录就交给他吧!大概原理就是,在查询出错的地方,记录错误日志,错误日志主要记录信息有:错误信息,文件位置(追根溯源一个个文件查上去直到入口),下面是一段示例记录错误信息的PHP代码供参考:

<?php
   // 记录sql错误日志
    private function logError($msg = "")
    {
        if (isset($this->_logfile))
        {
            if (!$msg)
            {
                if (!mysql_errno())
                {
                    return;
                }
                $msg = "mysql_errno: " . mysql_errno() . "\nmysql_error: " . mysql_error();
            }
            file_put_contents($this->_logfile, ‘[‘ . date(‘Y-m-d H:i:s‘) . "] $msg\n", FILE_APPEND);
            $trace = debug_backtrace();
            foreach ($trace as $call)
            {
                if(empty($call[‘file‘]) && empty($call[‘line‘]))
                {
                    continue;
                }
                file_put_contents($this->_logfile, "{$call[‘file‘]} on line {$call[‘line‘]}\n", FILE_APPEND);
            }
            file_put_contents($this->_logfile, "\n", FILE_APPEND);
        }
    }
 

    这样,你就有了一个可供参考的东西了,到时更改的时候,你只需去查看这个文件指示的地方,你就大概知道是什么错了,都知道什么错了,我想,要想解决问题,应该只是个时间问题了,而且是个短时间问题!

  正题二、如何解决问题?

    其实前面我已经说了,既然已经找到问题根源了,要解决问题只是个短时间问题,但是,我还是将给出一些解决方案作参考,毕竟,大家都这么忙,哪有时间破解你那烂代码!如下是一经常会出现的错误:

    1. 报错:[2002] 由于目标计算机积极拒绝,无法连接。解析:数据库连接信息错误,你可能把测试环境连接部署到线上去了,这问题大发了,赶紧恢复吧? 附注:如果没有报错是因为你线上机器可以连接测试库,那问题也大发了;

    2. 报错:[1146] Table ‘bbbq‘ doesn‘t exist。解析:表不存在,赶紧查查,是不是本次新加的表没有被添加到线上吧,或者表名写错了? 附注:一般过了测试的不太可能是表名写错了!

    3. 报错:[1054] Unknown column ‘column_x‘ in ‘field list‘。解析:指定的列不存在,要么库中没有,要么写错了,赶紧查! 附注: 同上。

    4. 报错:[1366] Incorrect string value: ‘\xA9\x96‘ 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可以自行强制转换类型处理此问题,但是结果可能已经超出你的预期!

  ...

  等等,还要养家糊口,赶着去上班,稍后补充!后续问题关键字提示:LOAD DATA INFILE, REPLACE ...

时间: 2024-10-03 10:29:04

有没有人曾告诉你,你的SQL又报错了?的相关文章

很少有人会告诉你的Android开发基本常识

原文:很少有人会告诉你的Android开发基本常识. 文章介绍了一些关于开发.测试.版本管理.工具使用等方面的知识.

没有人会告诉您乘坐飞机时的几个事实 但是您一定要知道

飞机缩小了地球上的距离,它使人们对世界的认识也发生了改变.以往的〝天涯海角〞如今在飞机这种交通工具的面前也不过是〝数小时之遥〞的概念了,人们对飞机的利用早已司空见惯.这个会飞的庞然大物看上去既熟悉又陌生,它有您不知道的事实和您对飞机认识的误区.这篇文章旨在给您解谜和消除你长久以来的恐惧心理. 长久以来,飞机在起飞及降落时,机长都会以飞行安全为由,要求乘客关闭所有电子用品的电源,包括手机.平板电脑.笔记型电脑还有相机. 但是,据<每日邮报>的报导,从当天下午起澳航(Qantas)以及澳洲维珍航空

Android开发经验谈-很少有人会告诉你的Android开发基本常识

本文介绍Android开发过程中的一些基本常识,大多是一些流程.专业术语和解决问题的方法等. 软件开发流程 一个完整的软件开发流程离不开策划.交互.视觉.软件.测试.维护和运营这七个环节,这七个环节并不是孤立的,它们是开发一款成功产品的前提,但每一项也都可以形成一个学科,是一个独立的岗位,随着敏捷开发的流行,以及来到了体验为王的时代,现代软件开发更多的是注重效率和敏捷,而不是循规蹈矩的遵循这些开发流程,比如软件开发的岗位不再仅仅是个技术岗位,它需要去参与前期的设计和评审.可以在视觉和交互方面提出

中国近代自我管理第一人曾文正日课四门:慎独、主敬、求仁、习劳

一是慎独是自我管理第一步,也是最难做到的.心里虽然知道对与错,日常却不能尽作到.人往往在自欺欺人,总在自责却不知改过.但外人却不知道,这只有自己内心明白.所以,儒家三纲八目中“诚意”放在首要置,就是让人平时尽力排除各种杂念妄想,去恶为善,以为天理.心中纯净自然泰然面对各种干挠,他是人自我管理的基础,是人生自强第一法门. 二是主敬则是身体强健.敬是孔子教育后人,春秋士夫也常提到.到了程朱就千言万语不离这个宗旨.程子说上下统一在于恭敬,则天地自己运行,万物自已发育生长,气数没有不和的.我说敬字最贴近

如何向非技术人(程序猿)解释SQL注入?

前两天看博客园新闻,有一篇文章名为<我该如何向非技术人解释SQL注入?>(http://kb.cnblogs.com/page/515151/).是一个外国人写的,伯乐在线翻译的.我当时看了一下,觉得蛮通俗易懂的,对于不懂编写程序及数据库SQL语言的人来说,理解应该没有问题. 今天早上上班坐地铁,看到糗百里的一个段子(原谅一个程序猿看跟编程技术不相关网站行为),笑过之后脑海中突然就跳出了这几个字“SQL注入”!先把那个段子Copy一份,大家先轻松一下: 一哥们是送快递的,一天送快递到人家楼下,

一张图告诉你是需要 SQL 还是 Hadoop

译序 很多朋友问时下如火如荼的 Hadoop 是否适合引进我们自己的项目,什么时候用 SQL,什么时候用 Hadoop,它们之间如何取舍?Aaron Cordova 用一张图来回答你这个问题,对于不同的数据场景,如何选取正确的数据存储处理工具进行了详细描述.Aaron Cordova 是美国大数据分析及架构专家,Koverse CTO 及联合创始人. 原文正文 Twitter 上的 @merv 转发了一篇博客<三角形的统计>.这是一篇关于如何统计一张图形里的三角形的博客,并将使用 Vertic

一张图告诉你是须要 SQL 还是 Hadoop

译序 非常多朋友问时下如火如荼的 Hadoop 是否适合引进我们自己的项目,什么时候用 SQL.什么时候用 Hadoop,它们之间怎样取舍?Aaron Cordova 用一张图来回答你这个问题,对于不同的数据场景,怎样选取正确的数据存储处理工具进行了具体描写叙述.Aaron Cordova 是美国大数据分析及架构专家.Koverse CTO 及联合创始人. 原文正文 Twitter 上的 @merv 转发了一篇博客<三角形的统计>.这是一篇关于怎样统计一张图形里的三角形的博客.并将使用 Ver

南都周刊 别了,老兵乔布斯

专题撰文 记者_ 秦旺 实习记者_ 陈震霖 8月25日,史蒂夫·乔布斯向全世界递交了辞职信.他的成绩单前所未有地辉煌,在他重新掌舵苹果的14年里,苹果股票上涨了90倍,市值从20.6亿美元膨胀为如今的3487亿美元,超过埃克森美孚,成为当今全球市值最大的公司,726亿美元的现金储备,甚至比美国政府还要有钱. 乔布斯留给后任的,无疑是一个巅峰的苹果,无论是营收.利润.增长.市值还是市场地位.产品影响力,都已经成为当之无愧的NO.1,堪称全球企业的典范,而不仅仅是最佳的技术公司. 从品位到精神,乔布

springMVC4(8)模型数据绑定全面分析

使用@ModelAttribute.Model.Map.@SessionAttributes能便捷地将我们的业务数据封装到模型里并交由视图解析调用.下面开始一一分析 在方法入参上使用@ModelAttribute 使用@ModelAttribute可以直接将我们的方法入参添加到模型中.我们先看一个实例: 1. springMVC核心文件配置: <!-- 扫描com.mvc.controller包下所有的类,使spring注解生效 --> <context:component-scan b