在MySQL中何时使用单引号、双引号和反斜线

我正在努力学习写查询的最佳方法。我也明白一致性的重要性。直到现在,我都是随意地使用单引号、双引号和反斜线,没有经过真正的思考。

比如说。

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

另外,在上述例子中,考虑到tablecol1val1等可能是变量。

这方面的标准是什么?你是怎么做的?

我在这里看了大约20分钟类似问题的答案,但似乎这个问题没有明确的答案。</sub&gt。

对该问题的评论 (1)
解决办法

背号要用于表和列的标识符,但只有当标识符是MySQL保留关键字,或标识符包含空白字符或超出限定集的字符时才有必要(见下文)通常建议尽可能避免使用保留关键字作为列或表的标识符,避免引号问题。

对于像VALUES()列表中的字符串值,应该使用单引号。 MySQL对字符串值也支持双引号,但单引号被其他RDBMS更广泛地接受,所以使用单引号而不是双引号是一个好习惯。

MySQL还希望DATE'和DATETIME'字面值是单引号的字符串,如'2001-01-01 00:00:00'。请查阅日期和时间字面意义文档以了解更多细节,特别是在日期字符串中使用连字符-作为分段分隔符的替代方法。

所以使用你的例子,我将在PHP字符串中使用双引号,在值'val1', 'val2'上使用单引号。NULL'是MySQL的一个关键字,也是一个特殊的(非)值,因此没有引号。

这些表或列的标识符都不是保留字,也没有使用需要引号的字符,但我还是用反斜线引号了它们(稍后会有更多内容...)。

RDBMS的本地函数(例如,MySQL中的NOW())不应加引号,尽管它们的参数也要遵守前面提到的字符串或标识符的引号规则。

回车键(`)
table & column ───────┬─────┬──┬─┬─┬────┬──┬────┬──┬────┬──┬───────┐
                      ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
$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中最流行的API,PDO和MySQLi,希望有_不加引号的占位符,其他语言中的大多数预备语句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、美元、下划线)。

你可以使用超出该字符集的字符作为表或列的标识符,例如包括空格,但你必须引用(反标)它们。

评论(11)

MySQL中的引号有两种类型。

  1. &#39;用于包围字符串字面。

还有"是一种特殊情况。 根据MySQL服务器'的[sql_mode][1],它可以同时用于上述目的中的_一个。

  1. 缺省情况下,"字符可以像&#39;一样,用来封闭字符串字元。
  2. 在[ANSI_QUOTES][2]模式下,"字符可以像`</code&gt一样用来封闭标识符。

以下查询将根据SQL模式产生不同的结果(或错误)。

SELECT "column" FROM table WHERE foo = "bar"

ANSI_QUOTES禁用

查询将选择字符串字面"列"其中列foo等于字符串"bar"

ANSI_QUOTES启用

查询将选择列column,其中列foo等于列bar

什么时候用什么

  • 我建议你避免使用",这样你的代码就会变得独立于SQL模式了。
  • 总是引用标识符,因为这是一个很好的做法(在SO上有不少问题讨论这个问题)。

[1]: https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html [2]: https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_ansi_quotes

评论(0)

(关于你的问题的SQL性质,上面有很好的回答,但如果你是PHP新手,这可能也是相关的。)

也许有必要提一下,PHP 对单引号和双引号字符串的处理方式不同......

单引号的字符串是'字元&#39。 而且几乎是所见即所得的字符串。 双引号字符串被 PHP 解释为可能的变量替换(PHP 中的 backticks 不完全是字符串。 它们在 shell 中执行一条命令并返回结果)。)

示例:{{13975631}}。

$foo = "bar";
echo 'there is a $foo'; // There is a $foo
echo "there is a $foo"; // There is a bar
echo `ls -l`; // ... a directory list
评论(0)

背号一般用来表示一个 "标识符",同时也是为了**安全,避免意外地使用保留关键词

比如说。

Use `database`;

这里的后缀将帮助服务器理解database实际上是数据库的名称,而不是数据库标识符。

对于表名和字段名也可以这样做。这是一个非常好的习惯,如果你用反斜线来包裹你的数据库标识符。

查看这个答案,了解更多关于反斜线的知识。


现在关于双引号& 单引号(Michael已经提到了)。

但是,要定义一个值,你必须使用单引号或双引号。让我们看看另一个例子。

INSERT INTO `tablename` (`id, `title`) VALUES ( NULL, title1);

这里我故意忘了用引号来包裹title1。现在,服务器将把title1作为一个列名(即一个标识符)。因此,为了表示它是一个值,你必须使用双引号或单引号。

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')
评论(0)

在MySQL中,这些符号是用来给查询定界的 ``` ,",'()` 。

"&#39;用于包围类似字符串的值"26-01-2014 00:00:00"&#39;26-01-2014 00:00:00&#39; 。 这些符号只适用于字符串,不适用nowsummax等集合函数。

select `column_name` from `table_name` where id=&#39;2&#39;

  1. ()简单地将查询的部分内容括起来,例如: select `column_name` from `table_name` where (id=&#39;2&#39; and gender=&#39;male&#39;)或name=&#39;rakesh&#39;
评论(0)

在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的作用。 (虽然准备好的语句更好)。

评论(0)

结合PHP和MySQL,双引号和单引号让你的查询编写时间变得更加简单。

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

现在,假设你在MySQL查询中使用了一个直接的post变量,那么,可以这样使用。

$query = "INSERT INTO `table` (`id`, `name`, `email`) VALUES (' ".$_POST['id']." ', ' ".$_POST['name']." ', ' ".$_POST['email']." ')";

这是使用PHP变量进入MySQL的最佳实践。

评论(4)

这里有很多有用的答案,一般归纳为两点。

  1. BACKTICKS(`)用于标识符名称周围。
  2. 单引号(')用于值的周围。

正如@MichaelBerkowski所说

后记号用于表和列的标识符,但是是指 &gt.只有当标识符是MySQL保留关键字时才需要。 只有当标识符是MySQL保留关键字时才需要,或者是 &gt.当标识符中包含空格字符或字符时 当标识符中包含空格字符或字符时。

超出有限的范围(见下文)通常建议避免使用

尽可能使用保留的关键字作为列或表的标识符。

避免了引号问题。

但有一种情况是,一个标识符既不能是保留的关键字,也不能包含空格超出限定集的字符,而必须在它们周围加上反引号。

例子

123E10是一个有效的标识符名称,但也是一个有效的INTEGER文字。

[不细说如何得到这样的标识符名],假设我想创建一个名为123456e6的临时表。

背标上没有ERROR。

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也是一个指数数。

评论(0)

如果表的列和值是变量,那么有两种方法。

用双引号""" "表示完整的查询。

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

 $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的保留关键字相似时,使用后面的刻度线``````````。

注意:如果你用表名来表示一个列名,那么就像这样使用后面的刻度线。

``表名.column_name````

评论(0)

像VALUES()列表中的字符串值应该使用单引号。

反引号一般用来表示标识符,也是为了避免意外使用保留的关键字。

在PHP和MySQL的组合中,双引号和单引号让你的查询编写时间变得如此简单。

评论(0)

除了所有(解释得很清楚)的答案外,还没有'提到以下内容,我经常访问这个Q&A。

总而言之。 MySQL认为你要在自己的表/列上做数学,并将连字符如"e-mail" 作为e 减去mail


免责声明:所以我想我应该把它作为一个"仅供参考" 类型的答案,供那些对数据库工作完全陌生的人使用,他们可能不理解所述的技术术语。

评论(0)

SQL服务器和MySQL,PostgreySQL,Oracle不理解双引号(")。 因此,你的查询应该不使用双引号("),而应该只使用单引号(')。

Back-trip(`)在SQL中是可选的,用于表名、db名和列名。

如果你想在后台写查询来调用MySQL,那么你可以使用双引号(")或单引号(')来将查询分配给一个变量,比如。

let query = "select id, name from accounts";
//Or
let query = 'select id, name from accounts';

如果在你的查询中出现了 "where "语句和/或试图 "插入 "一个值和/或 "更新 "一个字符串的值,请使用单引号(')来表示这些值,比如:{{13975641}}}。

let querySelect = "select id, name from accounts where name = 'John'";
let queryUpdate = "update accounts set name = 'John' where id = 8";
let queryInsert = "insert into accounts(name) values('John')";

//Please not that double quotes are only to be used in assigning string to our variable not in the query
//All these below will generate error

let querySelect = 'select id, name from accounts where name = "John"';
let queryUpdate = 'update accounts set name = "John" where id = 8';
let queryInsert = 'insert into accounts(name) values("John")';

//As MySQL or any SQL doesn't understand double quotes("), these all will generate error.

如果你想在使用双引号(")和单引号(')时远离这种混乱,建议坚持使用单引号('),这将包括反斜杠()这样。

let query = 'select is, name from accounts where name = \'John\'';

当我们必须动态分配一些值并执行一些字符串连接时,就会出现用double(")或single(')引号的问题,比如:{{13975643}}}。

let query = "select id, name from accounts where name = " + fName + " " + lName;
//This will generate error as it must be like name = 'John Smith' for SQL
//However our statement made it like name = John Smith

//In order to resolve such errors use
let query = "select id, name from accounts where name = '" + fName + " " + lName + "'";

//Or using backslash(\)
let query = 'select id, name from accounts where name = \'' + fName + ' ' + lName + '\'';

如果需要进一步审核,请按照[JavaScript中的引号][1] 进行。

[1]: https://stackoverflow.com/questions/242813/when-to-use-double-or-single-quotes-in-javascript

评论(0)