Answers:
反引号用于表和列标识符,但仅当标识符是MySQL保留关键字时,或者当标识符包含空格字符或超出限制集的字符时才需要使用反引号(请参见下文)。通常建议避免使用保留关键字在可能的情况下用作列或表的标识符,从而避免引用问题。
单引号应用于VALUES()
列表中的字符串值。MySQL还为字符串值支持双引号,但是单引号已被其他RDBMS广泛接受,因此使用单引号而不是双引号是一个好习惯。
MySQL还希望DATE
和DATETIME
文字值可以像字符串一样单引号'2001-01-01 00:00:00'
。有关更多详细信息,请查阅日期和时间文字文档,尤其是-
在日期字符串中使用连字符作为分段定界符的替代方法。
因此,使用您的示例,我将对PHP字符串加双引号,并在values上使用单引号'val1', 'val2'
。 NULL
是MySQL关键字,是一个特殊的(非)值,因此未加引号。
这些表或列标识符都不是保留字,也不使用需要引号的字符,但是无论如何我都用反引号将它们引号(稍后再说……)。
RDBMS固有的函数(例如,NOW()
在MySQL中)不应被引用,尽管它们的参数要遵循已经提到的相同的字符串或标识符引用规则。
反引号(`) 表格和列────────┬──────┬──┬──┬──┬────┬──┬────┬──┬──┬────┬──┬ ────────┐ ↓↓↓↓↓↓↓↓↓↓↓↓ $ query =“ 插入表中(id,col1,col2,date,updated) 值(NULL,'val1','val2','2001-01-01',NOW()) “; ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 未引用的关键字──────┴┴┴┘││││││││││││ 单引号(')字符串────────────┴────┴──┴──────││││││││ 单引号(')日期────────────┘││││ │ 未引用的函数──────────────────┴┴┴┴┘
变量的引用模式不会改变,尽管如果您打算直接在字符串中插入变量,则必须在PHP中将其双引号。只要确保您已正确转义了要在SQL中使用的变量即可。(建议使用支持预处理语句的API来防止SQL注入)。
//同一件事,但有一些变量替换 //这里,变量表名$ table用反引号引起来,并且变量 // VALUES列表中的单引号 $ query =“将INERT插入$ table(ID,col1,col2,date)值(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,美元,下划线)
您可以使用超出该范围的字符设置为表或列标识符,例如,包括空格,但随后必须引号(反引号)。
MySQL中有两种类型的引号:
'
用于封装字符串文字`
用于封闭标识符,例如表名和列名然后"
是一种特殊情况。根据MySQL服务器的不同,可以一次将其用于上述目的之一sql_mode
:
"
字符可用于封装字符串文字,就像'
ANSI_QUOTES
模式下,该"
字符可用于封装标识符,就像`
SELECT "column" FROM table WHERE foo = "bar"
查询将选择字符串文字"column"
,其中column foo
等于string"bar"
查询将选择column
列foo
等于列的列bar
"
以使您的代码独立于SQL模式(关于问题的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
反引号通常用于指示identifier
,并且可以安全地避免意外使用保留关键字。
例如:
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')
在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'
(
并)
简单地封装查询的一部分,例如 select `column_name` from `table_name` where (id='2' and gender='male') or name='rakesh'
。
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
是为了什么 (尽管准备好的陈述会更好。)
将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变量的最佳实践。
这里有许多有用的答案,通常可以归结为两点。
和@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
它也是一个指数数。
如果表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`
<-注意:.
从后壁虱排除。
SQL服务器和MySQL,PostgreySQL,Oracle不理解双引号(“)。因此,您的查询应不包含双引号(”),而应仅使用单引号(')。
Back-trip(`)在SQL中是可选的,用于表名,数据库名和列名。
如果您尝试在后端编写查询以调用MySQL,则可以使用双引号(“)或单引号(')将查询分配给变量,例如:
let query = "select id, name from accounts";
//Or
let query = 'select id, name from accounts';
如果这是where
查询中的一条语句,并且/或者试图获取insert
一个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\'';
当我们必须动态分配一些值并执行一些字符串连接时,出现double(“)或single(')引号的问题:
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中的引号
"tablename"
,单引号用于文本,例如'this is a some text'
。在标准SQL中从未使用过反引号。(如果需要在标识符中包含双引号,请键入两次"odd""tablename"
。同样,在文字中将双引号括起来,例如'Conan O''Brien'
。)