何时用撇号包围SQL字段?

时间:2011-03-13 14:57:01

标签: php mysql sql quotes

我注意到当我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'");

也许我的编码很糟糕,但我似乎记得在插入和选择操作失败时我是否没有用单引号括起一个字段。

4 个答案:

答案 0 :(得分:3)

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

对于 数字 类型,例如intbigintdecimal等,或SQL函数,例如{{1} },now(),您不需要引号。

答案 1 :(得分:3)

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

特别是,如果尚未设置php变量的内容,变量本身将消失,这可能会破坏您的语法。用单引号包围php变量至少会在变量消失的情况下保护语法。

SELECT * from something where age = $age;

如果由于某种原因没有设置$ age,例如用户没有在输入中输入它,它就会消失,这行代码会在运行时产生语法错误,因为它变为{{1} }

"where age = ;"

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

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

答案 2 :(得分:1)

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

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

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

数字不必括在引号中,但字符串文字必须包含在内。

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

答案 3 :(得分:0)

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