mysql我应该在mysql查询中使用撇号吗?

mysql我应该在mysql查询中使用撇号吗?,mysql,coding-style,standards,Mysql,Coding Style,Standards,向MySQL数据库写入数字数据类型查询的正确方法是什么: SELECT * FROM accounts WHERE id = 5; 或 我主要喜欢最后一种,使用“,因为它与文本数据类型更一致 它会影响性能吗?引号用于字符串,MySQL将读取这些引号,然后将其转换为整数,这比只处理一个int要慢 老实说,性能差异很小,但这就像编写一个程序,将数字存储在字符串中,然后在需要计算时转换为int。这是一种不好的做法。我怀疑您是否能够测量两个查询速度之间的任何明显差异。如果您关心性能,您应该确保在i

向MySQL数据库写入数字数据类型查询的正确方法是什么:

  SELECT * FROM accounts WHERE id = 5;

我主要喜欢最后一种,使用
,因为它与文本数据类型更一致


它会影响性能吗?

引号用于字符串,MySQL将读取这些引号,然后将其转换为整数,这比只处理一个int要慢


老实说,性能差异很小,但这就像编写一个程序,将数字存储在字符串中,然后在需要计算时转换为int。这是一种不好的做法。

我怀疑您是否能够测量两个查询速度之间的任何明显差异。如果您关心性能,您应该确保在
id
列上有一个索引。如果这样做,两个查询都会非常快

但也有安全方面的考虑

官方意见

建议您使用引号

一个常见的错误是只保护字符串数据值。记住也要检查数字数据。当用户输入值234时,如果应用程序生成一个查询,如SELECT*FROM table,其中ID=234,则用户可以输入值
234或1=1
,以使应用程序生成查询
SELECT*FROM table,其中ID=234或1=1
。因此,服务器检索表中的每一行。这会暴露每一行并导致服务器负载过大防止此类攻击的最简单方法是在数字常量周围使用单引号:
SELECT*from table WHERE ID='234'

我的

我的意见

尽管文档建议使用引号,但它既不必要也不足以防止所描述的攻击。例如,将攻击者的字符串更改为
234'或'1'='1
将挫败他们的方法

在我看来,使应用程序安全的更好方法是使用参数化查询,而不是将用户值直接放入字符串中


如果由于某种原因无法使用参数化查询,则不要使用引号,但应使用函数确保变量实际上包含整数。

根据id的类型,可以使用“5”或“5”。通常id是主键,类型为int,因此当数据库中的字段类型为字符串时,应该使用5个引号。否则,如果是数字,请不要使用引号。如果对数字字段类型使用引号,它确实会减慢查询速度,因为mysql必须将字符串与数字匹配。

与使用未引号的值相比,对类型定义为数字的列使用引号会对性能产生轻微影响,因为服务器必须在查询编译期间将字符串转换为正确的类型。除此之外,它没有任何效果,你可能会很难衡量打击。(请注意,由于“0”和“0”都作为字符串发送到服务器,因此在使用之前,必须将它们转换为字段的内部类型,因此发送“0”只会强制执行额外的步骤。首先,解析器解析出“0”然后优化器会注意到列类型是数值的,并进行相应的转换。OTOH,使用0,解析器会将其解析为数值[存储为长整型iirc],然后注意字段的类型,并在必要时将数值转换为适当的字段类型。因此,差异实际上是微不足道的)

然而,对类型定义为文本的列使用不带引号的数字是一个非常糟糕的主意,因为这意味着服务器无法使用该列上的任何索引来解析查询


重要的是要理解,尽管任何给定字符串都可以精确地表示一个数值,但有一组几乎无限的字符串可以表示给定的数值。考虑“0”、“0E0”、“0”等。这解释了为什么当字段为数字时引用约束不是很坏,只有操作要执行,并且它解释了当字段不是数字时,为什么不引用约束是不好的,因为这意味着服务器必须在比较之前将表中的每个字符串转换为一个数字。从而强制进行表扫描

因为它与文本数据类型更加一致
——但它不是文本数据类型。查询中的类型不匹配可能会导致全表扫描——看,我不知道它们实际上会导致这种不良行为。建议写数字文字,因为字符串文字符合我对MySQL的总体描述。我也不知道这一点。。。前一段时间,当在数值周围使用引号时,我遇到了性能问题…这仍然不是最佳实践,保护int输入的一种简单方法是将其转换为int。。。例如
$query=“从id=”的表格中选择*”。(int)$id。如果它已经是一个整数,则强制转换没有任何效果,也不会减慢速度,如果它不是一个有效的int,它将返回0,或者在MySQL示例中只返回数字1。当执行隐式类型强制转换时(对字符列使用数字),事情会变得更加混乱:参数化查询肯定是一种方法,永远不要将用户输入直接放入SQL查询字符串“数字作为字符串”的隐式类型转换也可能有潜在的不想要的副作用(例如未使用触发器),在使用引号表示数值时也存在此问题!
  SELECT * FROM accounts WHERE id = '5';