何时在mysql中使用单引号、双引号和反引号

km0tfn4u  于 2021-06-25  发布在  Mysql
关注(0)|答案(11)|浏览(497)

我正在努力学习编写查询的最佳方法。我也理解保持一致的重要性。到目前为止,我还没有真正考虑就随机使用了单引号、双引号和反引号。
例子:

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

同样,在上面的例子中,考虑 table , col1 , val1 等可以是变量。
这个标准是什么?你是做什么的?
我已经在这里读了20分钟关于类似问题的答案,但似乎这个问题没有明确的答案。

wnavrhmk

wnavrhmk1#

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 是给你的(尽管事先准备好的声明更好。)

igetnqfo

igetnqfo2#

这里有许多有用的答案,通常归结为两点。
回号()用于标识符名称周围。 在值周围使用单引号(')。 正如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 也是指数。

kpbwa7wx

kpbwa7wx3#

单引号应用于字符串值,如values()列表中的值。
反记号通常用于表示标识符,也可以防止意外使用保留关键字。
在php和mysql的组合中,双引号和单引号使您的查询编写时间变得更加容易。

o7jaxewo

o7jaxewo4#

反记号通常用来表示 identifier 同时也要避免意外使用保留关键字。
例如:

Use `database`;

在这里,backticks将帮助服务器理解 database 实际上是数据库的名称,而不是数据库标识符。
表名和字段名也可以这样做。如果用反记号 Package 数据库标识符,这是一个非常好的习惯。
检查这个答案,以了解更多关于backticks的信息。
关于双引号和单引号(michael已经提到)。
但是,要定义一个值,必须使用单引号或双引号。让我们看另一个例子。

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

在这里我故意忘记了 Package 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')
r1zhe5dt

r1zhe5dt5#

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

1yjd4xko

1yjd4xko6#

(关于问题的sql性质,上面有很好的答案,但是如果您是php新手,这也可能是相关的。)
也许有一点很重要,php处理单引号和双引号字符串的方式不同。。。
单引号字符串是“文本”,几乎是所见即所得的字符串。双引号字符串被php解释为可能的变量替换(php中的backticks不完全是字符串;它们在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
z2acfund

z2acfund7#

在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' ( 以及 ) 只需将查询的部分括起来,例如。 selectcolumn_namefromtable_namewhere (id='2' and gender='male') or name='rakesh' .

b1payxdu

b1payxdu8#

mysql中有两种类型的引号: ' 用于封闭字符串文字 用于封闭标识符,如表名和列名 然后就是了 `"` 这是一个特例。根据mysql服务器的不同,它一次可以用于上述目的之一 `sql_mode` : 默认情况下 `"` 字符可以用来括起字符串文字,就像 `'` 在 `ANSI_QUOTES` 模式 `"` 字符可以用来括起标识符,就像 ####以下查询将根据sql模式生成不同的结果(或错误):

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

ansi\U报价已禁用

查询将选择字符串文本 "column" where列 foo 等于字符串 "bar" ####ansi\U报价已启用
查询将选择列 column where列 foo 等于列 bar ####什么时候用什么
我建议你避免使用 " 使您的代码独立于sql模式
总是引用标识符,因为这是一个很好的实践(有很多问题,所以讨论这个)

j8yoct9x

j8yoct9x9#

反记号用于表和列标识符,但只有当标识符是mysql保留关键字时,或者当标识符包含空格字符或超出有限集的字符(见下文)时,才有必要使用反记号。通常建议尽可能避免将保留关键字用作列或表标识符,避免引用问题。
单引号应用于字符串值,如 VALUES() 列表。mysql对字符串值也支持双引号,但是单引号更广泛地被其他rdbms接受,因此使用单引号而不是双引号是一个好习惯。
mysql也期望 DATE 以及 DATETIME 将文字值作为字符串单引号,如 '2001-01-01 00:00:00' . 有关详细信息,请参阅日期和时间文本文档,特别是使用连字符的替代方法 - 作为日期字符串中的段分隔符。
因此,使用您的示例,我将对php字符串使用双引号,并对值使用单引号 'val1', 'val2' . NULL 是一个mysql关键字,是一个特殊的(非)值,因此不带引号。
这些表或列标识符都不是保留字,也没有使用需要引号的字符,但我还是用反勾号引用了它们(稍后将详细介绍…)。
rdbms固有的函数(例如, NOW() 在mysql中)不应被引用,尽管它们的参数遵循前面提到的相同的字符串或标识符引用规则。

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文档,您不需要使用以下字符集引用(backtick)标识符:
ascii码: [0-9,a-z,A-Z$_] (基本拉丁字母,数字0-9,美元,下划线)
您可以使用该集合之外的字符作为表或列标识符,例如包括空格,但必须引用(反勾选)它们。
此外,尽管数字是标识符的有效字符,但标识符不能仅由数字组成。如果他们这样做,他们必须用背虱子 Package 。

mklgxw1f

mklgxw1f10#

在php和mysql的组合中,双引号和单引号使您的查询编写时间变得更加容易。

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

现在,假设您在mysql查询中使用了一个direct post变量,那么可以这样使用它:

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

这是在mysql中使用php变量的最佳实践。

jgovgodb

jgovgodb11#

如果表列和值是变量,则有两种方法:
带双引号 "" 完整查询:

$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 <--注:排除 . 从后面的虱子。

相关问题