何时在MySQL中使用单引号,双引号和反引号
我正在尝试学习编写查询的最佳方法。 我也明白一致的重要性。 到现在为止,我没有任何真正的想法,随机使用单引号,双引号和反引号。
例:
$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';
另外,在上面的例子中,考虑"table," "col[n]," and "val[n]"
可能是variables。
这是什么标准? 你是做什么?
我已经在这里阅读了大约20分钟的类似问题的答案,但是似乎这个问题没有明确的答案。
反引号将用于表和列标识符,但只有在标识符是MySQL保留关键字时 ,或者标识符包含空白字符或超出限制集的字符时才需要(见下文)。通常build议避免使用保留关键字作为列或表标识符,尽可能避免报价问题。
单引号应该用于像VALUES()
列表中的string值。 MySQL的string值也支持双引号,但是其他RDBMS更容易使用单引号,所以使用单引号而不是double是个好习惯。
MySQL也希望DATE
和DATETIME
字面值像'2001-01-01 00:00:00'
这样'2001-01-01 00:00:00'
string单引号。 有关更多详细信息,请参阅date和时间文字文档,特别是使用连字符的替代方法-
作为datestring中的分隔符。
因此,使用你的例子,我会双引号的PHPstring,并使用值'val1', 'val2'
单引号。 NULL
是一个MySQL关键字和一个特殊的(非)值,因此不加引号。
这些表或列标识符都不是保留字,也不使用需要引用的字符,但反引号(后面会详细介绍)。
不应该引用RDBMS的本地函数(例如,MySQL中的NOW()
),尽pipe它们的参数受到已经提到的相同的string或标识符引用规则的约束。
反引号(`) 桌子和桌子───────────────────────────────────────────────────────────── ───────┐ ↓↓↓↓↓↓↓↓↓↓↓↓↓ $ query =“ INSERT INTO`table`(`id`,`col1`,`col2`,`date`,`updated`) VALUES(NULL,'val1','val2','2001-01-01',NOW()) “; ↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 未加引号的关键字─────┴┴┴┘│││││││││││ 单引号(')string────────────┴───────┴─────│││││││ 单引号(')DATE───────────────────────────┴───────────────────────────────── │ 不带引号的function──────────────────────────────────────────
variables插值
variables的引用模式不会改变,但是如果您打算直接在string中插入variables,则必须在PHP中使用双引号。 只要确保你已经正确地转义了在SQL中使用的variables。 ( build议使用支持预处理语句的API来防止SQL注入 )。
//与一些可变replace相同的东西 //这里,variables表名$ table是反引号的,并且是variables //在VALUES列表中是单引号 $ query =“INSERT INTO`$ table` (`id`,`col1`,`col2`,`date`)VALUES(NULL, '$ val1' , '$ val2' , '$ date' )”;
准备好的陈述
在处理准备好的陈述时,请参阅文档以确定陈述的占位符是否必须被引用。 在PHP,PDO和MySQLi中可用的最stream行的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,美元,下划线)
您可以使用超出该设置的字符作为表或列标识符,例如包括空格,但是您必须引用(反向)它们。
MySQL中有两种types的引号:
-
'
用于包含string文字 - 用于包含表名和列名等标识符
然后是"
这是一个特殊情况,根据MySQL服务器的sql_mode
它可以用于上述目的sql_mode
:
- 默认情况下 ,
"
字符可以用来像string一样包含string文字 - 在
ANSI_QUOTES
模式下,"
字符可以像`
一样用于包含标识符
以下查询将根据SQL模式产生不同的结果(或错误):
SELECT "column" FROM table WHERE foo = "bar"
禁用了ANSI_QUOTES
查询将selectstring文字"column"
,其中列foo
等于string"bar"
启用ANSI_QUOTES
查询将select列foo
等于列bar
列列
何时使用什么
- 我build议你避免使用
"
让你的代码独立于SQL模式 - 总是引用标识符,因为这是一个很好的做法(关于这个问题的几个问题,
(上面有关于你的问题的SQL性质的好答案,但是如果你是PHP新手,这也可能是相关的。)
也许有必要提一下,PHP处理单引号和双引号的string是不同的。
单引号string是“文字”,几乎所有的所见即所得的string。 双引号string被PHP解释为可能的variablesreplace(PHP中的反引号并不完全是string;它们在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
反引号通常用来表示一个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中使用双引号,您将使variables$val1
和$val2
使用它们的值,从而创build完全有效的查询。 喜欢
$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中的string文字是相同的。
string是由单引号(“'”)或双引号(“”“)字符组成的字节或字符序列。
所以,如果你的string包含单引号,那么你可以使用双引号来引用string,或者如果它包含双引号,那么你可以使用单引号来引用string。 但是,如果你的string包含单引号和双引号,则需要转义引用该string的引号。
大多数情况下,我们对一个SQLstring值使用单引号,所以我们需要对PHPstring使用双引号。
$query = "INSERT INTO table (id, col1, col2) VALUES (NULL, 'val1', 'val2')";
你可以在PHP的双引号string中使用一个variables:
$query = "INSERT INTO table (id, col1, col2) VALUES (NULL, '$val1', '$val2')";
但是,如果$val1
或$val2
包含单引号,这将使您的SQL错误。 所以你需要在sql中使用它之前将其转义; 这是mysql_real_escape_string
的用途。 (虽然准备好的声明更好。)
基本上在Mysql中,在查询`
, "
, '
和()
中使用了这些标识符。
-
"
或'
用于包含string的值如"26-01-2014 00:00:00"
'26-01-2014 00:00:00'
"26-01-2014 00:00:00"
或“'26-01-2014 00:00:00'
这些标识符只用于string非聚合函数,如now() or sum ,max
等 -
用于包含表或表列,例如从
table_name
中selectcolumn_name
,其中id ='2' -
()
仅用于包含部分查询,例如从table_name
中selectcolumn_name
,其中(id ='2'和gender ='male')或name ='rakesh'。
结合使用PHP和MySQL,双引号和单引号使查询写入时间变得更加简单。
$query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";
现在,假设你正在使用一个直接的postvariables进入MySQL查询,那么就这样使用它:
$query = "INSERT INTO `table` (`id`, `name`, `email`) VALUES (' ".$_POST['id']." ', ' ".$_POST['name']." ', ' ".$_POST['email']." ')";
这是在PHP中使用PHPvariables的最佳实践。
单引号应该用于像VALUES()列表中的string值。
反引号通常用来表示一个标识符,也可以安全的使用保留的关键字。
结合使用PHP和MySQL,双引号和单引号使查询写入时间变得更容易。
如果表格和值是variables,那么有两种方法:
用双引号""
完整的查询:
$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`
< – 注意:排除.
从后面蜱。
这里已经有了很多有用的答案,一般最终分为两点。
- 在标识符名称周围使用BACKTICKS(`)。
- QUOTES(')用于值。
和@MichaelBerkowski说
反引号将用于表和列标识符,但只有在标识符是MySQL保留关键字时,或者标识符包含空白字符或超出限制集的字符时才需要(见下文)。通常build议避免使用保留关键字作为列或表标识符,尽可能避免报价问题。
有一种情况,一个标识符既不能是一个保留关键字,也不能包含空格或字符超出限制集,但必然需要反引号。
例
123E10是一个有效的标识符名称,但也是一个有效的INTEGER文字。
[不详细说明如何得到这样的标识符名称],假设我想创build一个名为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也是一个指数。