何时在SQL字段周围加上撇号?

4
我注意到当我向数据库中插入和选择值时,必须要用单引号将字段括起来,如下所示: 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注入”。 - mvds
是的,我总是这样做,不用担心 ^_^ - John Smith
4个回答

4
当字段数据类型为字符串(例如text、char、varchar等)或日期类型(例如date、time、datetime等)时,您需要用引号将值括起来。
对于数字类型(例如int、bigint、decimal等)或SQL函数(例如now()、current_date等),您无需使用引号。请注意保留HTML标记。

3
"

"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 注入仍然是可能的,但这是另一个问题。

1

在查询中,您必须区分以下几种类型的内容:

  • 保留的 SQL 关键字:SELECTUPDATEWHERENULL 等(不区分大小写,但通常使用大写)
  • (SQL)运算符和语法标记:+ - / * . ( ) 等等
  • SQL 函数:NOW()CONCAT()
  • 字段、表名、数据库名:employees、age、name、date 等,应该使用反引号 `field` 进行引用,以避免混淆,例如如果您将一个字段命名为 ORDER

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

数字不需要用引号括起来,但字符串字面量需要。

这个描述远非完整或完美,但它应该给您一个开始理解的机会。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接