在数字数据类型上将查询写入MySQL数据库的正确方法是什么:
SELECT * FROM accounts WHERE id = 5;
或
SELECT * FROM accounts WHERE id = '5';
主要是我更喜欢最后一个,使用'
因为它与文本数据类型更加一致。
它会影响性能吗?
答案 0 :(得分:3)
引用是针对字符串的,MySQL会读取这些引号,然后将它转换为整数,这比将它交给int开始要慢。
老实说,性能差异很小,但它就像编写一个程序,将数字存储在字符串中,然后在需要进行数学运算时转换为int。这是不好的做法。
答案 1 :(得分:2)
我怀疑你可以衡量两个查询速度之间的任何明显差异。如果您关心性能,则应确保在id
列上有索引。如果你这样做,两个查询都会非常快。
但是出于安全考虑。
MySQL的官方意见
MySQL client security guidelines建议您使用引号。
常见错误是仅保护字符串数据值。记得也要检查数字数据。如果应用程序在用户输入值234时生成诸如SELECT * FROM表WHERE ID = 234之类的查询,则用户可以输入值
234 OR 1=1
以使应用程序生成查询SELECT * FROM table WHERE ID=234 OR 1=1
。结果,服务器检索表中的每一行。这会暴露每一行并导致过多的服务器负载。 防止此类攻击的最简单方法是在数字常量周围使用单引号:SELECT * FROM table WHERE ID='234'
。
强调我的。
我的意见
虽然文档建议使用引号,但它既不是必需也不是足够来防止它描述的攻击。例如,将攻击者的字符串更改为234' OR '1'='1
将会破坏他们的方法。
在我看来,确保应用程序安全的更好方法是使用参数化查询,而不是将用户值直接放入字符串中。
如果由于某种原因你不能使用参数化查询,那么不要使用引号,但要确保变量确实包含使用intval
函数的整数。
答案 2 :(得分:1)
根据id的类型,您可以使用'5'或5.通常id是主键,类型为int,因此您应该使用5
答案 3 :(得分:1)
当数据库中的字段类型为字符串时,请使用引号。否则,如果是数字,请不要使用引号。如果对数字字段类型使用引号,它确实会减慢查询速度,因为mysql必须将字符串与数字匹配。
答案 4 :(得分:1)
对于类型定义为数字的列使用带引号的数字,与使用不带引号的值相比,性能命中 teeny ,因为服务器必须在此期间将字符串转换为正确的类型查询编译。除此之外它没有任何影响,你可能会很难测量命中率。 (注意,由于“0”和0都作为字符串发送到服务器,因此它们必须在使用之前转换为字段的内部类型,因此发送“0”只会强制执行额外的步骤。首先解析器解析出来“0”然后优化器注意到列类型是数字并相应地转换它.OTOH,0解析器将它解析为数字[存储为long int iirc],然后注意字段的类型,并转换必要时,将数字设置为适当的字段类型。因此差异确实无关紧要。)
但是,对于其类型定义为 text 的列使用不带引号的号是一个非常糟糕的主意,因为这意味着服务器无法使用任何索引用于解析查询的列。
重要的是要理解,虽然任何给定的字符串都只有一个数值,但是有一组几乎无限的字符串,这些字符串数字化为给定的数值。考虑“0”,“0E0”,“0.0”等。这解释了为什么在字段为数字时引用约束并不是很糟糕,只有执行操作,它解释了为什么不引用约束是<当字段不是数字时,/ em> bad,因为这意味着服务器必须在执行比较之前将表中的每个字符串强制转换为数字,从而强制进行表扫描。