我正在努力学习编写查询的最佳方法.我也理解保持一致的重要性.到目前为止,我还没有真正的思考就随机使用了单引号、双引号和反勾号.
例子:
$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';
此外,在上面的例子中,考虑table
, col1
, val1
等可能是变量.
这个标准是什么?你是做什么的?
我已经在这里读了大约20分钟关于类似问题的答案,但似乎这个问题没有明确的答案
我正在努力学习编写查询的最佳方法.我也理解保持一致的重要性.到目前为止,我还没有真正的思考就随机使用了单引号、双引号和反勾号.
例子:
$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';
此外,在上面的例子中,考虑table
, col1
, val1
等可能是变量.
这个标准是什么?你是做什么的?
我已经在这里读了大约20分钟关于类似问题的答案,但似乎这个问题没有明确的答案
反勾号用于表和列标识符,但只有当标识符为MySQL reserved keyword时,或当标识符包含空格字符或超出有限集(见下文)的字符时,才有必要使用反勾号.通常建议尽可能避免使用保留关键字作为列或表标识符,以避免引用问题.
单引号应用于VALUES()
列表中的字符串值.MySQL对字符串值也支持双引号,但其他RDBMS更广泛地接受单引号,因此使用单引号而不是双引号是一个好习惯.
MySQL还希望DATE
和DATETIME
个文本值都是单引号字符串,比如'2001-01-01 00:00:00'
.有关更多详细信息,请参阅the Date and Time Literals文档,特别是在日期字符串中使用连字符-
作为段分隔符的替代方法.
因此,使用您的示例,我会对PHP字符串进行双引号,并对值'val1', 'val2'
使用单引号.NULL
是一个MySQL关键字,是一个特殊(非)值,因此不带引号.
这些表或列标识符都不是保留字,也没有使用需要引用的字符,但我还是用反勾号引用了它们(稍后将详细介绍…).
RDBMS固有的函数(例如,MySQL中的NOW()
)不应该被引用,尽管它们的参数受前面提到的相同字符串或标识符引用规则的约束.
Backtick (`) table & column ───────┬─────┬──┬──┬──┬────┬──┬────┬──┬────┬──┬───────┐ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ $query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`, `updated`) VALUES (NULL, 'val1', 'val2', '2001-01-01', NOW())"; ↑↑↑↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑↑↑↑↑ Unquoted keyword ─────┴┴┴┘ │ │ │ │ │ │ │││││ Single-quoted (') strings ───────────┴────┴──┴────┘ │ │ │││││ Single-quoted (') DATE ───────────────────────────┴──────────┘ │││││ Unquoted function ─────────────────────────────────────────┴┴┴┴┘
变量的引号模式不会改变,尽管如果要在字符串中直接插入变量,必须在PHP中使用双引号.只需确保已正确转义了SQL中使用的变量.(It is recommended to use an API supporting prepared statements instead, as protection against SQL injection).
// Same thing with some variable replacements // Here, a variable table name $table is backtick-quoted, and variables // in the VALUES list are single-quoted $query = "INSERT INTO `$table` (`id`, `col1`, `col2`, `date`) VALUES (NULL, '$val1', '$val2', '$date')";
使用准备好的语句时,请查阅文档,以确定是否必须引用语句的占位符.PHP、PDO和MySQLi中最流行的API预计有unquoted个占位符,其他语言中最常用的语句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 (?, ?, ?, ?)";
According to MySQL documentation,则不需要使用以下字符集引用(反勾选)标识符:
ASCII:
[0-9,a-z,A-Z$_]
(基本拉丁字母,数字0-9,美元,下划线)
您可以使用该集合之外的字符作为表或列标识符,例如,包括空格,但随后您可以对它们进行must引号(倒勾).
此外,尽管数字是标识符的有效字符,但标识符不能仅由数字组成.如果他们这样做了,他们必须被包裹在背上.