反引号 何时在MySQL中使用单引号,双引号和反标号




反引号 (9)

结合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的最佳实践。

我正在尝试学习编写查询的最佳方法。 我也明白一致的重要性。 到现在为止,我没有任何真正的想法,随机使用单引号,双引号和后勾号。

例:

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

另外,在上面的例子中,考虑"table," "col[n]," and "val[n]"可能是变量。

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

我一直在阅读关于这里约20分钟的类似问题的答案,但似乎没有这个问题的明确答案。


如果表格和值是变量,那么有两种方法:

用双引号""完整查询:

$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` < - 注意:排除. 从后面滴答。


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

反引号通常用于指示一个标识符,也可以安全使用保留的关键字。

结合使用PHP和MySQL,双引号和单引号使查询写入时间变得更加简单。


反引号通常用于表示一个identifier ,并且可以安全地防止意外使用保留关键字

例如:

Use `database`;

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

表名称和字段名称也可以做同样的事情。 如果使用反引号包装数据库标识符,这是一个很好的习惯

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

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

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

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

基本上在Mysql中,在查询`"'()中使用了这些类型的标识符。

  1. "'用于包含字符串,如值为"26-01-2014 00:00:00" '26-01-2014 00:00:00' "26-01-2014 00:00:00"或“ '26-01-2014 00:00:00' 。这些标识符仅用于字符串非聚合函数,如now() or sum ,max

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

  3. ()仅用于包含部分查询,例如从table_name中选择column_name ,其中(id ='2'和gender ='male')或name ='rakesh'。


这里有很多有用的答案,通常最终分为两点。

  1. BACKTICKS( )`用在标识符名称周围。
  2. QUOTES(')用于值。

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


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

也许有必要提到PHP处理单引号和双引号的字符串不同。

单引号字符串是'文字',几乎是所见即所得的字符串。 双引号字符串被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

MySQL中有两种类型的引号:

  1. '用于包含字符串文字
  2. `用于包含表名和列名等标识符

然后是"这是一个特殊情况,它可以用于上面提到的目的之一 ,具体取决于MySQL服务器的sql_mode

  1. 默认情况下"字符可以用来包含字符串文字,就像'
  2. ANSI_QUOTES模式下, "字符可以像`一样用于包含标识符

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

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

禁用ANSI_QUOTES

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

启用ANSI_QUOTES

查询将选择列foo等于列bar列列

何时使用什么

  • 我建议你避免使用"以便你的代码独立于SQL模式
  • 总是引用标识符,因为这是一种很好的做法(关于SO的很多问题都要讨论)

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

单引号应该用于像VALUES()列表中的字符串值。 MySQL的字符串值也支持双引号,但其他RDBMS更容易使用单引号,所以使用单引号而不是double是个好习惯。

MySQL还希望DATEDATETIME字面值DATETIME引号为'2001-01-01 00:00:00''2001-01-01 00: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,az,AZ$_] (基本拉丁字母,数字0-9,美元,下划线)

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





quotes