MySQL语句中非字符串文字的引号

时间:2014-11-19 16:15:59

标签: mysql literals single-quotes

我知道MySQL语句中的字符串文字需要包含在单引号中,如下所示:

SELECT * FROM my_table WHERE str_column='test'

我想知道是否有充分的理由在这样的引号中包含非字符串文字,例如像这样:

SELECT * FROM my_table WHERE int_column='1'

而不是

SELECT * FROM my_table WHERE int_column=1

使用单引号包含非字符串文字是否有意义?或者只是浪费字节?

2 个答案:

答案 0 :(得分:1)

我在所有值上使用单引号来防止将来更改列。例如,我们的productID曾经是INT,12。有一次,我们添加了一些管理层希望拥有字母数字产品ID的服务。我们将productID更改为VarChar,20并且我们的代码都没有跳过。

答案 1 :(得分:0)

你是对的,没有必要引用数字文字。但我经常看到它。

引用数字文字也没有任何缺点。 MySQL在数值上下文中使用时会自动将它们转换为数值,例如与INT列比较或在算术表达式中使用。

我认为,当引用数字文字时,最常见的情况是将应用程序变量插入到SQL字符串中。

例如:

<?php
$num = $_POST['num'];
$sql = "SELECT * FROM my_table WHERE int_column = $num"; // not safe! SQL injection hazard!

即使&#39;数字&#39;参数应该是一个整数,恶意用户可以传递包含额外SQL语法的字符串参数,从而利用您的应用程序。

修复可能是使用real_escape_string(),但这假设变量将在SQL中的带引号的字符串内。因此,您需要在SQL表达式中引用它,然后插入转义值:

<?php
$num = $mysqli->real_escape_string($_POST['num']);
$sql = "SELECT * FROM my_table WHERE int_column = '$num'"; // safer

但是将数字变量强制转换为普通整数同样安全,这将剥离任何非数字内容:

<?php
$num = (int) $_POST['num'];
$sql = "SELECT * FROM my_table WHERE int_column = $num"; // safe too

最后,使用查询参数最安全。然后你不需要引用变量,也不要逃避它:

$num = $_POST['num'];
$sql = "SELECT * FROM my_table WHERE int_column = ?"; // totally safe
$stmt = $mysqli->prepare($sql);
$stmt->bind_param("i", $num);
$stmt->execute();