为了账号安全,请及时绑定邮箱和手机立即绑定

数据库查询字段类型问题

数据库查询字段类型问题

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

2 回答

?
largeQ

TA贡献2039条经验 获得超8个赞

针对@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.更推荐preparedstatement
mysql>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:1
mysql>select*fromtemp;
+------+
|k|
+------+
|1|
|2|
|3|
|0|
+------+
4rowsinset(0.00sec)
mysql>updatetempsetk='a'wherek=1;
QueryOK,1rowaffected,1warning(0.00sec)
Rowsmatched:1Changed:1Warnings:1
mysql>updatetempsetk='20'wherek=2;
QueryOK,1rowaffected(0.00sec)
Rowsmatched:1Changed:1Warnings:0
mysql>updatetempsetk='30a'wherek=3;
QueryOK,1rowaffected,1warning(0.01sec)
Rowsmatched:1Changed:1Warnings:1
mysql>select*fromtemp;
+------+
|k|
+------+
|0|
|20|
|30|
|0|
+------+
4rowsinset(0.00sec)
                            
查看完整回答
反对 回复 2019-04-13
  • 2 回答
  • 0 关注
  • 523 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号