何时用撇号包围 SQL 字段?

Posted

技术标签:

【中文标题】何时用撇号包围 SQL 字段?【英文标题】:When to surround SQL fields with apostrophes? 【发布时间】:2011-07-14 11:49:18 【问题描述】:

我注意到,当我将 INSERTSELECT 值传入和传出数据库时,我必须用单引号将字段括起来,如下所示:

mysql_query("INSERT INTO employees (name, age) VALUES ('$name', '$age')");

但是,如果我要更新年龄,我不会使用单引号:

mysql_query("UPDATE employees SET age = age + 1 WHERE name = '$name'");

此外,似乎在将日期添加到 SQL 数据库时,我也不必用单引号将其括起来:

mysql_query("INSERT INTO employees (name, date) VALUES ('$name', NOW())");

此外,当使用像 CONCAT 这样的运算符时,似乎也没有必要:

mysql_query("UPDATE employees SET name=CONCAT(name,$lastName) WHERE id='$id'");

也许我只是编码不好,但我似乎记得如果我在插入和选择字段时没有用单引号括起来操作失败。

【问题讨论】:

虽然主题不同,但也请阅读有关在查询中输入转义值的信息:仅将 $name 放入字符串中是不安全的。搜索例如mysql_real_escape_string() 和“sql-injection”。 是的,我总是这样做,不用担心^_^ 【参考方案1】:

当字段数据类型为 string 例如textcharvarchar 等或 时,您需要用引号将值括起来日期 类型,例如datetimedatetime

对于 numerical 类型,例如 intbigintdecimal 等或 SQL 函数,例如 now()current_date,您不需要'不需要引号。

【讨论】:

【参考方案2】:

“age”作为 php 变量 ($age) 和 MySQL 列名存在于问题中。列名不应该被引用(一般来说),但是在 select 或 insert 语句中使用的列的内容应该被引用。

特别是,如果没有设置 php 变量的内容,则该变量本身将消失,这可能会破坏您的语法。用单引号包围 php 变量至少可以保护语法,以防变量消失。

SELECT * from something where age = $age;

如果由于某种原因 $age 没有设置,比如用户没有在输入时输入它,它会简单地消失,并且这行代码会在运行时产生语法错误,因为它变成了"where age = ;"

SELECT * from something where age = '$age';

如果由于某种原因没有设置 $age,它会消失但不会产生错误,因为它会变成“where age = '';”并且仍然是很好的语法。

当然,在这种情况下仍然可以进行 SQL 注入,但这是一个不同的问题。

【讨论】:

【参考方案3】:

您必须区分您在查询中看到的内容类型:

保留的sql关键字:SELECTUPDATEWHERENULL、...(不区分大小写,但主要使用大写) (sql) 运算符和语法标记: + - / * 。 ( ) 等等等等 sql 函数:NOW(), CONCAT(), ... 字段、表名、数据库名称:员工、年龄、姓名、日期……应该使用反引号引起来,例如 `field`,以避免混淆,例如如果你命名一个字段ORDER 价值观

最后一组,即值,可以是字符串文字,如“John”或“John”,或数字,如 1、10、1e9、1.005。 NULL 是一个特殊的值,可以粗略地描述为“未设置”。

数字不必用引号括起来,但字符串文字可以。

这个描述远非完整或完美,但它应该让你开始理解。

【讨论】:

【参考方案4】:

字符串值(包括单个字符)必须用单引号括起来。这包括使用字符串表示的日期常量。数值不需要引号。

【讨论】:

以上是关于何时用撇号包围 SQL 字段?的主要内容,如果未能解决你的问题,请参考以下文章

为啥从返回的网格中复制的值用引号标记?

如何防止字段集的边框穿过表单标签包围的图例元素?

在 VBA Access 中用 null 替换撇号

文本字段退格动作识别文本字段何时为空?

如何知道键盘何时隐藏文本字段?

DecimalFormat 分组符号的不同表示