2011-11-11 29 views
0

如果我有一个MySQL查询,如:一次讲话商标查询

SELECT this FROM that WHERE id='10' 

SELECT this FROM that WHERE id=10 

似乎都正常工作。

什么是在MySQL查询中使用单一的语音标记?什么时候使用它们是正确的?

+0

[如何在mysql插入语句中包含PHP变量](http:// stackoverflow。com/questions/7537377/how-to-include-a-php-variable-inside-a-mysql-insert-statement) –

+2

顺便说一句,它们通常被称为*单引号*。 –

+0

@ Col.Shrapnel:这不是重复的。这只是一个关于MySQL语法的问题;它与PHP界面无关。 –

回答

1

如果该值是一个字符串,你必须使用'"

如果该值是一个数字,就像在你的榜样,你还没有使用',但MySQL的处理它,如果你把它挂'秒。

0

你应该总是使用它们。他们可以帮助阻止SQL injection攻击,因为mysql_real_escape_string是不够的。

这是假设你通过PHP运行查询。

+0

哎呦......这应该是一条评论... –

1

假设id是数字列,什么情况是,MySQL的自动转换您的参数号码,数据类型比较之前匹配。它完美地工作,除非铸造提供意想不到的结果。例如,这些表达与匹配ID行= 10,因为所有的字符串转换为:

id='10' 
id=' 10' 
id='00010' 
id='10foo' 

下不会行,因为非可解析字符串转换为和10 <匹配> 0:

id='foo10' 
id='bar' 

什么时候使用?如果你想要一个字符串,你需要需要引用它(没有其他的方式来键入一个字符串,并获得有效的SQL)。如果你想要一个数字,它必须不加引号(否则,你会得到一个恰好包含数字的字符串)。当然,您始终可以将数字作为字符串提供,并让MySQL执行转换,但除了一个额外的步骤以外,它不会真正为查询添加任何内容,并且可能会导致不被注意的错误结果。

3

当MySQL执行查询,存在参数的隐式转换。 如果id是INT,则将'10'转换为整数。 如果id是VARCHAR或其他文本类型,则将10转换为字符串。 在这两种情况下,这两个查询都可以工作(除非您在STRICT模式下运行)。

从性能的角度来看,你必须使用正确的数据类型(不使用整数参数报价) - 的隐式转换的开销增加,并且某些情况下,可能会伤害索引查询的性能。

从安全的角度来看,它更容易总是使用引号和参数没有加引号mysql_real_escape_string(万一,mysql_real_escape_string不会停止任何攻击,不使用引号,例如“UNION SELECT password FROM users”。但是,更好的方法是将您的变量强制转换为int,或者使用prepared statements

+0

+1方式比接受的答案更丰富:) –