猿问

数据库查询字段类型问题

$q=2;
①$sql="select*fromuserwhereid='".$q."'";
②$sql="select*fromuserwhereid='$q'";
③$sql="select*fromuserwhereid=$q";
以上三条语句执行效果是一样的
①②里面$q是字符串型的吧
③的$q是整型
我这样理解不知道对不对
user表里的id字段设置的是int
为何查询的时候是字符串型的也能查出来呢
菜鸟在此谢过
慕容708150
浏览 524回答 2
2回答

largeQ

针对@R.ming的回答我更新下。我想表达的是mysql在类型不同的情况下他会自动进行类型转换,这不光是在数据插入的时候才会做,在数据更新、查询和删除的时候都会这么做。老规矩,上例子。(重点是最后一个select)mysql>createtabletemp(avarchar(10));QueryOK,0rowsaffected(0.01sec)mysql>insertintotempvalues('a');QueryOK,1rowaffected(0.01sec)mysql>insertintotempvalues('1');QueryOK,1rowaffected(0.00sec)mysql>select*fromtempwherea=1;+------+|a|+------+|1|+------+1rowinset,1warning(0.01sec)mysql>select*fromtempwherea=0;+------+|a|+------+|a|+------+1rowinset,1warning(0.00sec)反对公子的答案,这个和php无关,对于php来说这三条sql语句都只是普通的字符串而已。楼主这个问题是因为mysql他做了兼容处理。对于字段是int类型的,如果你传入字符串(无论是在select,insert还是update),他会尝试转为数字的(类似于php中的intval)。具体可以看下面贴的这个例子。另外,如果在诸如postgresql之类的数据库上,这种类型不符是会抛错误的。p.s.由于mysql的这种特性,一般推荐无论是否是字符串类型,全部加上单引号以降低sql注入的风险。←不是说加了单引号就无法注入了,降低而已。再p.s.更推荐preparedstatementmysql>createtabletemp(kint);QueryOK,0rowsaffected(0.02sec)mysql>desctemp;+-------+---------+------+-----+---------+-------+|Field|Type|Null|Key|Default|Extra|+-------+---------+------+-----+---------+-------+|k|int(11)|YES||NULL||+-------+---------+------+-----+---------+-------+1rowinset(0.04sec)mysql>insertintotempvalues(1),(2),(3),('a');QueryOK,4rowsaffected,1warning(0.01sec)Records:4Duplicates:0Warnings:1mysql>select*fromtemp;+------+|k|+------+|1||2||3||0|+------+4rowsinset(0.00sec)mysql>updatetempsetk='a'wherek=1;QueryOK,1rowaffected,1warning(0.00sec)Rowsmatched:1Changed:1Warnings:1mysql>updatetempsetk='20'wherek=2;QueryOK,1rowaffected(0.00sec)Rowsmatched:1Changed:1Warnings:0mysql>updatetempsetk='30a'wherek=3;QueryOK,1rowaffected,1warning(0.01sec)Rowsmatched:1Changed:1Warnings:1mysql>select*fromtemp;+------+|k|+------+|0||20||30||0|+------+4rowsinset(0.00sec)
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答