|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
php本地模拟的prepare底层就是mysql_real_escape_string,所以必须得用mysql_set_character_set去设置mysql->charset,否则就存在字符集问题。假如你的数据库计划在任何一栏中都同意NULL值的话,你必要懂得一下,在你的查询语句中,分歧的子句是如何看待这一成绩的。
从外表上看,大概显现出如许的情况,即SQL子句IN与EXISTS能够交换。但是,在处置NULL值时,它们的体现一模一样,并且失掉的了局也极可能分歧。成绩源于如许一个现实,即在一个Oracle数据库中,一个NULL值意味着未知,因而,对一个NULL值的任何对照或操纵也都是有效的,而任何前往NULL的测试也都被无视了。比方,以下这些查询语句都不会前往任何行:
selecttruefromdualwhere1=null;
selecttruefromdualwhere1!=null;
值1既不克不及说是即是NULL,也不克不及说是不即是NULL。只要是NULL的时分才会前往一个真实的NULL值并前往一行。
selecttruefromdualwhere1isnull;
selecttruefromdualwherenullisnull;
当你利用IN时,相称于你告知SQL承受一个值,并将它与某个清单中利用=的每个值或一组值举行对照。只需存在了任何NULL值,就不会前往任何行,纵使两个值都是NULL也不可。
selecttruefromdualwherenullin(null);
selecttruefromdualwhere(null,null)in((null,null));
selecttruefromdualwhere(1,null)in((1,null));
一个IN从功效上同等于=ANY子句:
selecttruefromdualwherenull=ANY(null);
selecttruefromdualwhere(null,null)=ANY((null,null));
selecttruefromdualwhere(1,null)=ANY((1,null));
当你利用一种与EXISTS同等的格局时,SQL管帐算行数,却无视子查询中的值,就算你前往NULL也一样。
selecttruefromdualwhereexists(selectnullfromdual);
selecttruefromdualwhereexists(select0fromdualwherenullisnull);
从逻辑上看,IN与EXISTS是一样的。IN子句在内部查询中对照子查询前往的值,并过滤失落行;EXISTS子句在子查询外部对照那些值并过滤失落行。在呈现NULL值的情形下,作为了局而呈现的那些行是不异的。
selectenamefromempwhereempnoin(selectmgrfromemp);
selectenamefromempewhereexists(select0fromempwheremgr=e.empno);
不外,当逻辑被变化成利用NOT IN和NOT EXISTS时,成绩就呈现了,这两个语句会前往分歧的行(第一个查询会前往0行;第二个前往意想的数据-它们是分歧的查询):
selectenamefromempwhereempnonotin(selectmgrfromemp);
selectenamefromempewherenotexists(select0fromempwheremgr=e.empno);
NOT IN子句实践上与用=对照每个值不异,假如任何一个测试为FALSE 或NULL的话,它就会失利。比方:
selecttruefromdualwhere1notin(null,2);
selecttruefromdualwhere1!=nulland1!=2;
selecttruefromdualwhere(1,2)notin((2,3),(2,null));
selecttruefromdualwhere(1,null)notin((1,2),(2,3));
这些查询不会前往任何行。而第二个更值得嫌疑,1!=NULL是NULL,因而对全部WHERE前提来讲都是毛病的。它们会如许运转:
selecttruefromdualwhere1notin(2,3);
selecttruefromdualwhere1!=2and1!=3;
只需你在了局中制止体系前往NULL,在这之前你仍是可使用NOT IN查询(一样,这些都能运转,不外我假定empno不是NULL,在我们这个案例中,这是一个很好的假定):
selectenamefromempwhereempnonotin(selectmgrfromempwheremgrisnotnull);
selectenamefromempwhereempnonotin(selectnvl(mgr,0)fromemp);
因为懂得了IN,EXISTS,NOT IN,和NOT EXISTS之间的不同,当一个子查询的数据中呈现NULL时,你就能够制止一个十分广泛的成绩了。这章描述如何检查和处理在MySQL数据库中的数据损坏。如果你的表损坏很多,你应该尝试找出其原因!见G.1调试一个MySQL服务器。 |
|