我正在学习编写查询的最佳方法。我也明白始终如一的重要性。到目前为止,我没有经过任何真正的思考就随意地使用单引号、双引号和反引号。
例子:
$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中有两种类型的引号:
'用于封装字符串字面量 ’用于包含表名和列名等标识符
然后是“这是一个特例”。根据MySQL服务器的sql_mode,它可以同时用于上述目的之一:
默认情况下,"字符可以用来包含字符串字面量,就像' 在ANSI_QUOTES模式中,“字符可以用来包含标识符,就像'
以下查询将根据SQL模式产生不同的结果(或错误):
SELECT "column" FROM table WHERE foo = "bar"
ANSI_QUOTES禁用
该查询将选择字符串字面值"column",其中column foo等于字符串"bar"
ANSI_QUOTES启用
该查询将选择column foo等于column bar的列列
什么时候用什么
我建议您避免使用“”,这样您的代码就独立于SQL模式 总是引用标识符,因为这是一个很好的实践(很多关于SO的问题都讨论了这个)
其他回答
这里有很多有用的答案,通常归结为两点。
BACKTICKS(')用于标识符名称周围。 单引号(')用于值周围。
正如@MichaelBerkowski所说
反勾号用于表和列标识符,但是 只有当标识符是MySQL保留关键字时才需要,或者 当标识符包含空白字符或字符时 超出限定的范围(见下文)通常建议避免使用 尽可能使用保留的关键字作为列或表标识符, 避免引用问题。
但也有一种情况,标识符既不能是保留关键字,也不能包含空格或超出限定集的字符,但必须在它们周围加上反引号。
例子
123E10是一个有效的标识符名称,也是一个有效的INTEGER字面值。
假设我想创建一个名为123456e6的临时表。
反刻度没有错误。
DB [XXX]> create temporary table `123456e6` (`id` char (8));
Query OK, 0 rows affected (0.03 sec)
不使用反勾号时出错。
DB [XXX]> create temporary table 123451e6 (`id` char (8));
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '123451e6 (`id` char (8))' at line 1
但是,123451a6是一个非常好的标识符名称(没有反勾号)。
DB [XXX]> create temporary table 123451a6 (`id` char (8));
Query OK, 0 rows affected (0.03 sec)
这完全是因为1234156e6也是一个指数数。
单引号应该用于像values()列表中的字符串值。
反勾号通常用来表示标识符,也可以避免意外使用保留的关键字。
在PHP和MySQL的组合中,双引号和单引号使您的查询编写时间更容易。
如果表cols和值是变量,那么有两种方法:
用双引号""完成查询:
$query = "INSERT INTO $table_name (id, $col1, $col2)
VALUES (NULL, '$val1', '$val2')";
Or
$query = "INSERT INTO ".$table_name." (id, ".$col1.", ".$col2.")
VALUES (NULL, '".$val1."', '".$val2."')";
单引号":
$query = 'INSERT INTO '.$table_name.' (id, '.$col1.', '.$col2.')
VALUES (NULL, '.$val1.', '.$val2.')';
当列/值名称类似于MySQL保留关键字时,使用反勾' '。
注意:如果你用一个表名来表示一个列名,那么就像这样使用后勾号:
“table_name”。' column_name ' <——注:排除。从后面的节拍。
MySQL中有两种类型的引号:
'用于封装字符串字面量 ’用于包含表名和列名等标识符
然后是“这是一个特例”。根据MySQL服务器的sql_mode,它可以同时用于上述目的之一:
默认情况下,"字符可以用来包含字符串字面量,就像' 在ANSI_QUOTES模式中,“字符可以用来包含标识符,就像'
以下查询将根据SQL模式产生不同的结果(或错误):
SELECT "column" FROM table WHERE foo = "bar"
ANSI_QUOTES禁用
该查询将选择字符串字面值"column",其中column foo等于字符串"bar"
ANSI_QUOTES启用
该查询将选择column foo等于column bar的列列
什么时候用什么
我建议您避免使用“”,这样您的代码就独立于SQL模式 总是引用标识符,因为这是一个很好的实践(很多关于SO的问题都讨论了这个)
反勾号通常用来表示标识符,也可以避免意外使用保留关键字。
例如:
Use `database`;
这里的反引号将帮助服务器理解数据库实际上是数据库的名称,而不是数据库标识符。
对于表名和字段名也可以这样做。如果用反勾号包装数据库标识符,这是一个非常好的习惯。
检查这个答案,以了解更多关于反撇号。
现在谈谈双引号和单引号(Michael已经提到过了)。
但是,要定义一个值,您必须使用单引号或双引号。让我们看另一个例子。
INSERT INTO `tablename` (`id, `title`) VALUES ( NULL, title1);
在这里,我故意忘记用引号将标题1括起来。现在服务器将把标题1作为列名(即一个标识符)。因此,要表示它是一个值,你必须使用双引号或单引号。
INSERT INTO `tablename` (`id, `title`) VALUES ( NULL, 'title1');
现在,结合使用PHP,双引号和单引号使您的查询编写时间更容易。让我们看看你问题中查询的修改版本。
$query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";
现在,在PHP中使用双引号,您将使变量$val1和$val2使用它们的值,从而创建一个完全有效的查询。就像
$val1 = "my value 1";
$val2 = "my value 2";
$query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";
将会使
INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, 'my value 1', 'my value 2')