什么是编写一个查询,以便对数字数据类型MySQL数据库的正确方法:
SELECT * FROM accounts WHERE id = 5;
要么
SELECT * FROM accounts WHERE id = '5';
主要是我喜欢最后一个,用'
因为它是文本数据类型更加一致。
这是否影响性能?
什么是编写一个查询,以便对数字数据类型MySQL数据库的正确方法:
SELECT * FROM accounts WHERE id = 5;
要么
SELECT * FROM accounts WHERE id = '5';
主要是我喜欢最后一个,用'
因为它是文本数据类型更加一致。
这是否影响性能?
报价为字符串,MySQL是要读这些报价,然后将其转换为一个整数,这会更慢然后就交给它一个int开始。
老实说性能差异较小,但它就像写在字符串存储号码,然后投下时,它需要做一些数学为int的程序。 这是不好的做法。
我怀疑,你可以测量两个查询的速度之间的差异noticable。 如果您关心的性能,你应该确保你对一个索引id
列。 如果你这样做,这两个查询会非常快。
然而,有一些安全注意事项。
MySQL官方意见
在MySQL客户端的安全指导方针建议你使用引号。
一个常见的错误是只保护字符串数据值。 记住要检查数值数据为好。 如果应用程序产生的查询如SELECT * FROM表WHERE ID = 234当用户输入值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
功能。
根据ID的类型,你可以使用“5”或5。通常ID是主键是int类型的,所以你应该使用5
使用引号,当你的数据库中的字段类型为字符串。 否则,如果它是数字,不要使用引号。 如果使用引号的数字字段的类型,可以真正减慢查询,因为MySQL必须匹配字符串的数字。
使用针对其类型被定义为数字有一个很小的性能损失相比,使用不带引号的值,如服务器具有查询编译期间将字符串转换为正确的类型的柱子引用数。 除此之外,它没有任何效果,你可能将很难在所有测量命中。 (注意,如为“0”和0作为字符串发送到服务器必须将它们转换成内部类型的字段的反正使用之前,作为这样的发送的“0”仅仅迫使一个额外的步骤。首先,分析器分析出中的“0”,那么优化程序注意到列类型是数字,并相应地将其转换。OTOH,0解析器将解析它作为一个数字[存储作为长整型IIRC],然后注意字段的类型,并转换如有必要,数字到合适的字段类型。所以,差别真的是微不足道)。
然而,使用带引号的数字针对其类型被定义为文本是一个非常非常糟糕的主意一列,因为它意味着服务器无法使用该列的任何索引来解析查询。
要明白,而任何给定的字符串nummifies正好一个数值也有几乎无限的一套nummify给定的数字值的字符串是很重要的。 考虑“0”,“0E0”,“0.0”等,这就解释了为什么当引用的字段是一个数字是不是真的很差,只有执行操作的约束,它可以解释为什么不引用约束是不好当的场不是数字,因为它意味着服务器具有在表在进行比较之前投每个字符串为数字,从而迫使表扫描。