问题:何时在MySQL中使用单引号,双引号和反引号

我正在尝试学习编写查询的最佳方法。我也了解保持一致的重要性。到目前为止,我在没有任何实际考虑的情况下随机使用单引号,双引号和反引号。

示例:

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

此外,在上面的示例中,请考虑tablecol1val1等可能是变量。

这是什么标准?你做什么?

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

标签:mysql,sql,quotes

回答1:

反引号用于表和列的标识符,但是仅当标识符为 MySQL保留关键字,或者当标识符包含空格字符或超出限制集的字符时(请参见下文),通常建议避免在可能的情况下将保留关键字用作列或表标识符,以避免报价问题。

单引号应用于字符串值,例如VALUES()列表中的字符串值。 MySQL还为字符串值支持双引号,但是单引号已被其他RDBMS广泛接受,因此使用单引号代替双引号是一个好习惯。

MySQL还希望DATEDATETIME文字值被单引号括为字符串,如'2001-01-0100:00:00' 。查阅日期和时间文字文档有关更多详细信息,特别是在日期字符串中使用连字符-作为分段定界符的替代方法。

因此,使用您的示例,我将对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中使用的变量即可。 (建议使用支持预备语句的API来防止SQL注入)。

// 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期望未加引号的占位符,其他大多数语言的预准备语句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,美元,下划线)

您可以使用超出该范围的字符设置为表或列标识符,例如,包括空格,但随后您必须引用(反引号)。

回答3:

(关于问题的SQL性质,上面有很好的答案,但是如果您不熟悉PHP,这也可能是相关的。)

也许值得一提的是,PHP处理单引号和双引号的字符串的方式有所不同...

单引号字符串是'literal',并且几乎是所见即所得的字符串。 PHP将双引号字符串解释为可能的变量替换(PHP中的反引号并非完全是字符串;它们在Shell中执行命令并返回结果)。

示例:

$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

回答4:

反引号通常用于指示identifier,并且还可以防止意外使用保留的关键字

例如:

Use `database`;

这里的反引号将帮助服务器了解database实际上是数据库的名称,而不是数据库标识符。

可以对表名和字段名进行相同的操作。如果您用反引号包装数据库标识符,这是一个好习惯

检查答案,以了解有关反引号的更多信息。


现在有关双引号和单引号(迈克尔已经提到过)。

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

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')

回答5:

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

  1. "'用于封装类似字符串的值"26-01-201400:00:00"'26-01-201400:00:00'。这些符号仅用于字符串,不适用于诸如nowsum,或max

  2. `用于包含表名或列名,例如从"table_name"中选择"column_name",其中id='2'

  3. ()只是将查询的部分括起来,例如从"table_name"中选择"column_name",其中(id='2',性别='male')或name='rakesh'

回答6:

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的用途。 (尽管准备好的陈述会更好。)

回答7:

结合使用PHP和MySQL,双引号和单引号使您的查询编写时间变得更加轻松。

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

现在,假设您在MySQL查询中使用直接发布变量,然后按以下方式使用它:

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

这是在MySQL中使用PHP变量的最佳实践。

回答8:

这里有很多有用的答案,通常可以归结为两点。

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

还有@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也是一个指数数字。

回答9:

如果表cols和value是变量,则有两种方法:

用双引号""完整查询:

$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保留关键字时,使用反引号``

注意::如果您用表名表示列名,则使用像这样的反引号:

`table_name``column_name` <-注意:从回勾中排除.

回答10:

对于字符串值(如VALUES()列表中的字符串),应使用单引号。

反引号通常用于表示标识符,并且可以避免意外使用保留关键字。

结合使用PHP和MySQL,双引号和单引号使您的查询编写时间变得更加轻松。

回答11:

除了所有(充分解释的)答案外,没有提到以下内容,我经常访问此问答。

简而言之; MySQL认为您要在自己的表/列上进行数学运算,并将诸如"电子邮件"之类的连字符解释为e 邮件


免责声明:因此,我想针对那些刚接触数据库并且可能不了解上述技术术语的人,将其添加为" FYI"类型的答案。

回答12:

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

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

如果您尝试在后端编写查询以调用MySQL,则可以使用双引号(")或单引号(')将查询分配给变量,例如:

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

如果查询中有一个where语句,并且/或者尝试插入一个值和/或一个值的update,该值是字符串对这些值使用单引号('),例如:

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\'';

当我们必须动态分配一些值并执行一些字符串连接时,会出现双引号(")或单(')引号的问题。

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中的报价

回到顶部