0

我知道 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

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

4

2 回答 2

1

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

于 2014-11-19T16:29:28.263 回答
0

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

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

我相信引用数字文字有用的最常见情况是当您将应用程序变量插入 SQL 字符串时。

例如:

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

即使“num”参数预期为整数,恶意用户也可以传递包含额外 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();
于 2014-11-19T16:31:26.330 回答