我正在学习编写查询的最佳方法。我也明白始终如一的重要性。到目前为止,我没有经过任何真正的思考就随意地使用单引号、双引号和反引号。

例子:

$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';

同样,在上面的例子中,考虑table、col1、val1等可能是变量。

这个标准是什么?你会怎么做?

我已经在这里看了大约20分钟类似问题的答案,但这个问题似乎没有明确的答案。


当前回答

除了所有这些(解释得很好的)答案之外,我还没有提到以下问题,我经常访问这个问答。

简单地说;MySQL认为您想在它自己的表/列上做数学运算,并将连字符(如“e-mail”)解释为e-mail。


免责声明:因此,对于那些完全不熟悉数据库的人以及可能不理解已经描述的技术术语的人,我认为我将添加这一点作为“供参考”类型的回答。

其他回答

在MySQL中,这些符号用于分隔查询',','和()。

或'用于封闭类似字符串的值"26-01-2014 00:00:00"或"26-01-2014 00:00:00"。这些符号只用于字符串,而不是像now、sum或max这样的聚合函数。 ’用于包含表名或列名,例如:select ' column_name ' from ' table_name ' where id='2' (和)简单地包含查询的部分,例如从' table_name '中选择' column_name ' where (id='2' and gender='male')或name='rakesh'。

如果表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')

MySQL和PHP中的字符串文字是相同的。

字符串是包含在字节或字符中的序列 单引号(" ' ")或双引号(" " ")字符。

如果你的字符串包含单引号,那么你可以使用双引号来引用字符串,或者如果它包含双引号,那么你可以使用单引号来引用字符串。但如果字符串同时包含单引号和双引号,则需要转义用于字符串引号的字符串。

大多数情况下,我们对SQL字符串值使用单引号,因此我们需要对PHP字符串使用双引号。

$query = "INSERT INTO table (id, col1, col2) VALUES (NULL, 'val1', 'val2')";

你可以使用PHP双引号字符串中的变量:

$query = "INSERT INTO table (id, col1, col2) VALUES (NULL, '$val1', '$val2')";

但是如果$val1或$val2包含单引号,则会使SQL出错。所以你需要在sql中使用它之前转义它;这就是mysql_real_escape_string的作用。(尽管事先准备好的陈述更好。)