首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL语句中非字符串文本的引号

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

Stack Overflow用户
提问于 2014-11-19 16:15:59
回答 2查看 496关注 0票数 1

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

代码语言:javascript
复制
SELECT * FROM my_table WHERE str_column='test'

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

代码语言:javascript
复制
SELECT * FROM my_table WHERE int_column='1'

而不是

代码语言:javascript
复制
SELECT * FROM my_table WHERE int_column=1

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-19 16:31:26

你说得对,没有必要引用数字文字。但我经常看到。

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

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

例如:

代码语言:javascript
复制
<?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表达式中引用它,然后插入转义值:

代码语言:javascript
复制
<?php
$num = $mysqli->real_escape_string($_POST['num']);
$sql = "SELECT * FROM my_table WHERE int_column = '$num'"; // safer

但是,将数值变量强制转换为普通整数也同样安全,它将删除任何非数字内容:

代码语言:javascript
复制
<?php
$num = (int) $_POST['num'];
$sql = "SELECT * FROM my_table WHERE int_column = $num"; // safe too

最后,使用查询参数是最安全的。那么您就不需要引用变量,也不需要转义它:

代码语言:javascript
复制
$num = $_POST['num'];
$sql = "SELECT * FROM my_table WHERE int_column = ?"; // totally safe
$stmt = $mysqli->prepare($sql);
$stmt->bind_param("i", $num);
$stmt->execute();
票数 0
EN

Stack Overflow用户

发布于 2014-11-19 16:29:28

我对所有值使用单引号来防止将来对列的更改。例如,我们的productID曾经是INT,12。在某个时候,我们添加了一些管理人员希望拥有alpha-数值产品ID的服务。我们将productID更改为VarChar,20岁,我们的代码都没有跳过一拍。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27021657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档