When to use single quotes, double quotes, and backticks in MySQL
我正在尝试学习编写查询的最佳方法。 我也理解保持一致的重要性。 到现在为止,我已经随机使用单引号,双引号和反引号而没有任何实际想法。
例:
1 | $query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)'; |
此外,在上面的示例中,考虑
这是什么标准? 你是做什么?
我一直在这里阅读类似问题的答案大约20分钟,但似乎没有明确答案这个问题。 sub>
反引号用于表和列标识符,但仅在标识符是MySQL保留关键字时,或者当标识符包含空格字符或超出有限集的字符时才需要(见下文)。通常建议避免使用保留关键字尽可能作为列或表标识符,避免引用问题。
单引号应该用于
MySQL还希望
因此,使用您的示例,我会双引号PHP字符串并在值
这些表或列标识符都不是保留字或使用需要引用的字符,但我还是用反引号引用它们(稍后会详细介绍......)。
不应引用RDBMS本机函数(例如,MySQL中的
1 2 3 4 5 6 7 8 9 10 | 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注入)。
1 2 3 4 |
准备好的陈述
使用准备好的语句时,请查阅文档以确定是否必须引用语句的占位符。 PHP,PDO和MySQLi中最流行的API可以使用未加引号的占位符,其他语言中的大多数预处理语句API也是如此:
1 2 3 4 5 |
需要在标识符中引用反引号的字符:
根据MySQL文档,您不需要使用以下字符集引用(反引号)标识符:
ASCII:
[0-9,a-z,A-Z$_] (basic Latin letters, digits 0-9, dollar, underscore)
您可以使用超出该组的字符作为表或列标识符,例如包括空格,但是您必须引用(反引号)它们。
MySQL中有两种类型的引号:
然后有
以下查询将根据SQL模式生成不同的结果(或错误):
ANSI_QUOTES已禁用
查询将选择字符串文字
ANSI_QUOTES已启用
查询将选择列
什么时候用
-
我建议您避免使用
" ,以便您的代码独立于SQL模式 - 总是引用标识符,因为这是一个很好的做法(关于SO的很多问题讨论这个)
(关于你的问题的SQL性质,上面有很好的答案,但如果你是PHP的新手,这也可能是相关的。)
也许重要的是要提到PHP处理单引号和双引号字符串不同...
单引号字符串是'文字',几乎是WYSIWYG字符串。 PHP解释双引号字符串可能的变量替换(PHP中的反引号不完全是字符串;它们在shell中执行命令并返回结果)。
例子:
1 2 3 4 |
反引号通常用于表示
例如:
1 |
这里的反引号将帮助服务器理解
可以对表名和字段名执行相同的操作。如果用反引号包装数据库标识符,这是一个非常好的习惯。
Check this answer to understand more about backticks.
现在关于双引号和单引号(迈克尔已经提到过)。
但是,要定义一个值,您必须使用单引号或双引号。让我们看另一个例子。
在这里,我故意忘记用引号包装
现在,结合PHP,双引号和单引号使您的查询编写时间更容易。让我们在您的问题中看到查询的修改版本。
1 | $query ="INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')"; |
现在,在PHP中使用双引号,您将使变量
1 2 3 | $val1 ="my value 1"; $val2 ="my value 2"; $query ="INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')"; |
会做的
在MySQL中,这些符号用于分隔查询
MySQL和PHP中的字符串文字是相同的。
A string is a sequence of bytes or characters, enclosed within either
single quote ("'") or double quote (""") characters.
因此,如果您的字符串包含单引号,那么您可以使用双引号来引用字符串,或者如果它包含双引号,那么您可以使用单引号来引用字符串。但是,如果您的字符串包含单引号和双引号,则需要转义用于引用字符串的字符串。
大多数情况下,我们对SQL字符串值使用单引号,因此我们需要对PHP字符串使用双引号。
1 | $query ="INSERT INTO table (id, col1, col2) VALUES (NULL, 'val1', 'val2')"; |
你可以在PHP的双引号字符串中使用一个变量:
1 | $query ="INSERT INTO table (id, col1, col2) VALUES (NULL, '$val1', '$val2')"; |
但是如果
这里有很多有用的答案,通常最终分为两点。
和@MichaelBerkowski说
Backticks are to be used for table and column identifiers, but are
only necessary when the identifier is aMySQL reserved keyword, or
when the identifier contains whitespace characters or characters
beyond a limited set (see below) It is often recommended to avoid
using reserved keywords as column or table identifiers when possible,
avoiding the quoting issue.
但是有一种情况,即标识符既不是保留关键字,也不包含有限集之外的空格或字符,但必须围绕它们进行反引号。
例
[没有详细说明如何获得这样的标识符名称],假设我想创建一个名为
反推没有错误。
不使用反引号时出错。
1 2 |
但是,
这完全是因为
结合PHP和MySQL,双引号和单引号使您的查询编写时间变得更加容易。
1 | $query ="INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')"; |
现在,假设您正在使用直接post变量进入MySQL查询,那么使用它:
1 | $query ="INSERT INTO `table` (`id`, `name`, `email`) VALUES ('".$_POST['id']." ', '".$_POST['name']." ', '".$_POST['email']." ')"; |
这是将PHP变量用于MySQL的最佳实践。
如果表cols和values是变量,那么有两种方法:
使用双引号
1 2 | $query ="INSERT INTO $table_name (id, $col1, $col2) VALUES (NULL, '$val1', '$val2')"; |
要么
1 2 | $query ="INSERT INTO".$table_name." (id,".$col1.",".$col2.") VALUES (NULL, '".$val1."', '".$val2."')"; |
使用单引号
1 2 | $query = 'INSERT INTO '.$table_name.' (id, '.$col1.', '.$col2.') VALUES (NULL, '.$val1.', '.$val2.')'; |
当列/值名称类似于MySQL保留关键字时,请使用返回ticks
注意:如果您使用表名表示列名,那么请使用这样的返回标记:
单引号应该用于字符串值,如VALUES()列表中所示。
反引号通常用于表示标识符,并且不会意外地使用保留关键字。
结合PHP和MySQL,双引号和单引号使您的查询编写时间变得更加容易。
除了所有(解释清楚的)答案之外,还没有提到以下内容,我经常访问此问答。
简而言之; MySQL认为你想在自己的表/列上进行数学运算,并将诸如"电子邮件"之类的连字符解释为
免责声明:所以我认为我会将此作为"FYI"类型的答案添加到那些完全不熟悉数据库并且可能不理解已经描述的技术术语的人那里。
SQL服务器和MySQL,PostgreySQL,Oracle不理解双引号(")。因此,您的查询应该没有双引号("),并且应该只使用单引号(')。
回溯(`)是在SQL中使用的可选项,用于表名,数据库名和列名。
如果您尝试在后端编写查询来调用MySQL,那么您可以使用双引号(")或单引号(')将查询分配给变量,如:
1 2 3 |
如果你的查询中有一个
1 2 3 4 5 6 7 8 9 10 11 12 | 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. |
如果你想在使用双引号(")和单引号(')时避免这种混淆,建议坚持使用单引号(')这将包括反斜杠(),如:
1 | let query = 'select is, name from accounts where name = \'John\''; |
当我们必须为动态分配一些值并执行一些字符串连接时,会出现double(")或single(')引号的问题:
1 2 3 4 5 6 7 8 9 | 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中的引号