我很好奇在MYSQL查询中引用整数的缺点
例如
SELECT col1,col2,col3 FROM table WHERE col1='3';
VS
SELECT col1,col2,col3 FROM table WHERE col1= 3;
如果有性能成本,它的大小是什么以及为什么会出现?除了表演还有其他任何不利之处吗?
由于 安德鲁
编辑:此问题的原因
因为我很好奇,因为我想了解其中的差异
2.我正在尝试一种在我的PHP代码中将复合键从我的数据库传递为psudo-Id-keys(PIK)的方法。这些PIK用于定位记录。
例如,给定主键(AreaCode,Category,RecordDtm)
我在网址中的PIK看起来像这样:
index.php?action=hello&Id=20001,trvl,2010:10:10 17:10:45
我会选择这样的记录:
$Id = $_POST['Id'];//equals 20001,trvl,2010:10:10 17:10:45
$sql = "SELECT AreaCode,Category,RecordDtm,OtherColumns.... FROM table WHERE (AreaCode,Category,RecordDtm) = ({$Id});
$mysqli->query($sql):
......and so on.
此时查询将无法工作,因为日期时间(必须引用)并且它对sql注入是开放的,因为我没有转义这些值。鉴于我不会总是知道我的PIK是如何构造的,我会写一个函数将Id PIK分成逗号,用real_escape_string清理每个部分并将它与引用的值一起放回去。例如: $ Id =“'20001','trvl','2010:10:10 17:10:45'” 当然,在这个分解和清理Id的功能中,我可以检查值是否为数字。如果是数字,请不要引用它。如果它只是一个字符串,那么引用它。
答案 0 :(得分:6)
性能成本是每当mysql需要进行类型转换时,无论你将它提供给列的数据类型。所以使用您的查询
SELECT col1,col2,col3 FROM table WHERE col1 ='3';
如果col1不是字符串类型,MySQL需要将'3'转换为该类型。这种类型的查询并不是什么大问题,因为转换的性能开销可以忽略不计。
然而,当你尝试做同样的事情,比如加入2个表,每个表有几百万行。如果ON
子句中的列不是相同的数据类型,则MySQL必须每次转换数百万行运行查询, 是性能开销的来源。
答案 1 :(得分:2)
字符串与数字的排序顺序也不同。
比较
SELECT 312 < 41
(产生0,因为312 数字在41之后出现)
为:
SELECT '312' < '41'
(收益1,因为'312'按字典顺序出现在'41'之前)
根据使用引号构建查询的方式可能会给出错误的结果,或者根本不会。
数字应该这样使用,所以除非你有特殊的理由,否则不要使用引号。
答案 2 :(得分:1)
据我所知,我认为在你提到的情况下没有性能/尺寸成本。即使有,但它是非常微不足道的,不会影响你的申请。
答案 3 :(得分:0)
它给出了关于列的数据类型的错误印象。作为局外人,我认为有问题的专栏是CHAR / VARCHAR&amp;相应地选择操作。
否则,MySQL与大多数其他数据库一样,会隐式地将值转换为列数据类型。我知道这没有性能问题但是提供需要显式转换的值(使用CAST or CONVERT)的风险会触发错误。
答案 4 :(得分:-1)
Have a look at this.他们在不同的字段类型之间进行了一些性能评估。