反引号用于表和列标识符,但仅在标识符是MySQL保留关键字时,或者当标识符包含空格字符或超出有限集的字符时才需要(见下文)。通常建议避免使用保留关键字尽可能作为列或表标识符,避免引用问题。
单引号应该用于VALUES()列表中的字符串值。MySQL也支持双引号用于字符串值,但单引号被其他RDBMS更广泛地接受,因此使用单引号而不是双引号是一个好习惯。
MySQL还期望DATE和DATETIME文字值单引号为字符串'2001-01-01 00:00:00'。有关更多详细信息,请参阅日期和时间文字文档,特别是使用连字符-作为日期字符串中的段分隔符的替代方法。
因此,使用您的示例,我将双引号PHP字符串并在值上使用单引号'val1', 'val2'。 NULL是一个MySQL关键字,一个特殊的(非)值,因此没有引用。
这些表或列标识符都不是保留字或使用需要引用的字符,但我还是用反引号引用它们(稍后会详细介绍......)。
NOW()不应引用RDBMS本机函数(例如,在MySQL中),尽管它们的参数受到已经提到的相同字符串或标识符引用规则的约束。
反引号(`)
表格和栏目───────────────────────────────────── ───────┐
↓↓↓↓↓↓↓↓↓↓↓↓
$ query =“ INSERT INTO`table`(`id`,`col1`,`col2`,`date`,`updated`)
VALUES(NULL,'val1','val2','2001-01-01',NOW()) “;
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
不带引号的关键字────────││││││││││││││││││││││││││││││││││││││││││
单引号(')字符串───────────────────────│││││││
单引号(')DATE──────────────────────────────────────────────────────────────────────────── │
不带引号的功能───────────────────────────────
可变插值
变量的引用模式不会改变,但如果您打算直接在字符串中插入变量,则必须在PHP中使用双引号。只需确保已正确转义变量以便在SQL中使用。(建议使用支持预处理语句的API,以防止SQL注入)。
//一些变量替换相同的东西
//这里,变量表名称$ table是反引号和变量
//在VALUES列表中是单引号
$ query =“INSERT INTO` $ table`(`id`,`col1`,`col2`,`date`)VALUES(NULL,'$ val1','$ val2','$ date')”;
准备好的陈述
使用准备好的语句时,请查阅文档以确定是否必须引用语句的占位符。PHP,PDO和MySQLi中最流行的API可以使用未加引号的占位符,其他语言中的大多数预处理语句API也是如此:
// PDO example with named parameters, unquoted
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (:id, :col1, :col2, :date)";
// MySQLi example with ? parameters, unquoted
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (?, ?, ?, ?)";
需要在标识符中引用反引号的字符:
根据MySQL文档,您不需要使用以下字符集引用(反引号)标识符:ASCII :( [0-9,a-z,A-Z$_]基本拉丁字母,数字0-9,美元,下划线)
您可以使用超出该组的字符作为表或列标识符,例如包括空格,但是您必须引用(反引号)它们。