Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中何时使用单引号、双引号和反勾号_Mysql_Sql_Quotes - Fatal编程技术网

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

在MySQL中何时使用单引号、双引号和反勾号,mysql,sql,quotes,Mysql,Sql,Quotes,我正在努力学习编写查询的最佳方法。我也理解保持一致的重要性。到目前为止,我还没有真正的思考就随机使用了单引号、双引号和反勾号 例如: $query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)'; 此外,在上面的例子中,考虑表,COL1,VAL1等可能是变量。< /P> 这个标准是什么?你是做什么的 我在这里已经阅读了大约20分钟关于类似问题的答案,但似乎这个问题没有明确的答案。反勾用于表和列标识符,但只有当标识

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

例如:

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

此外,在上面的例子中,考虑表,COL1,VAL1等可能是变量。< /P> 这个标准是什么?你是做什么的


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

反勾用于表和列标识符,但只有当标识符为,或者,当标识符包含空格字符或超出有限集的字符时(见下文),通常建议尽可能避免使用保留关键字作为列或表标识符,以避免引用问题

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

单引号应用于字符串值,如“值”列表中的值。MySQL对字符串值也支持双引号,但其他RDBMS更广泛地接受单引号,因此使用单引号而不是双引号是一个好习惯

MySQL还希望DATE和DATETIME文本值以字符串形式单引号引用,如“2001-01-01 00:00:00”。有关更多详细信息,请参阅文档,特别是在日期字符串中使用连字符作为段分隔符的替代方法

因此,使用您的示例,我将双引号引述PHP字符串,并对值“val1”、“val2”使用单引号。NULL是一个MySQL关键字,是一个特殊的非值,因此不带引号

这些表或列标识符中没有一个是保留字,也没有使用需要引用的字符,但我还是引用了它们,后面会有更多关于这方面的内容

例如,现在MySQL中的RDBMS原生函数不应该被引用,尽管它们的参数受前面提到的相同字符串或标识符引用规则的约束

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 ─────────────────────────────────────────┴┴┴┴┘ 标识符中需要回勾引用的字符: ,不需要使用以下字符集引用反勾号标识符:

ASCII:[0-9,a-z,a-z$979;]基本拉丁字母,数字0-9,美元,下划线

您可以使用该集合之外的字符作为表或列标识符,例如,包括空格,但必须引用反勾号


此外,尽管数字是标识符的有效字符,但标识符不能仅由数字组成。如果需要,则必须用反勾号包装。

反勾号通常用于指示标识符,并且可以防止意外使用

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
例如:

Use `database`;
在这里,反勾号将帮助服务器理解数据库实际上是数据库的名称,而不是数据库标识符

表名和字段名也可以这样做。如果用反勾号包装数据库标识符,这是一个非常好的习惯

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
检查答案以了解有关回跳的更多信息

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
关于双引号和单引号,Michael已经提到了这一点

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

INSERT INTO `tablename` (`id, `title`) VALUES ( NULL, title1);
在这里,我故意忘记用引号把标题1括起来。现在,服务器将标题1作为列名,即标识符。因此,要表示它是一个值,必须使用双引号或单引号

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

如果表COL和值是变量,则有两种方法:

使用双引号完成整个查询:

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

单引号:

当列/值名称类似于MySQL保留关键字时,请使用back ticks``标记

注意:如果用表名表示列名,请使用如下反勾号:

`表_name``column_name`关于您的问题的SQL性质,上面有很好的答案,但是如果您是PHP新手,这也可能是相关的

也许有一点很重要,PHP处理单引号字符串和双引号字符串的方式不同

单引号字符串是“文本”,几乎是WYSIWYG字符串。双引号字符串由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和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\u real\u escape\u字符串的用途。尽管事先准备好的语句更好。

MySQL中有两种类型的引号:

'用于封闭字符串文字 `用于封装标识符,如表名和列名 然后是一个特例。根据MySQL服务器的不同,它可以一次用于上述目的之一:

默认情况下,该字符可用于括起字符串文字,就像' 在模式中,字符可用于包含标识符,就像` 根据SQL模式,以下查询将产生不同的结果或错误: ANSI_引号已禁用 查询将选择字符串文字列,其中foo列等于stringbar

启用ANSI_引号 查询将选择列foo等于列bar的列

什么时候用什么 我建议您避免使用,这样您的代码就独立于SQL模式了 始终引用标识符,因为这是一个很好的实践,所以有很多问题需要讨论
在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变量的最佳实践。

单引号应用于字符串值,如值列表中的值


反勾号通常用于指示标识符,并防止意外使用保留关键字


在PHP和MySQL的组合中,双引号和单引号使您的查询编写时间变得非常简单。

在MySQL中,这些符号用于分隔查询“,”和

或“用于封闭字符串,如值26-01-2014 00:00:00”或“26-01-2014 00:00:00”。这些符号仅用于字符串,而不是now、sum或max等聚合函数

`用于封闭表或列名,例如,从'table_name'中选择'column_name',其中id='2'

只需将查询的一部分括起来,例如从'table\u name`where id='2'和gender='male'或name='rakesh'中选择'column\u name'


这里有许多有用的答案,通常归结为两点

BACKTICKS`用于标识符名称周围。 “单引号”用于值周围。 正如@MichaelBerkowski所说


反勾号用于表和列标识符,但是 仅当标识符是MySQL保留关键字时才需要,或 当标识符包含空格字符或多个字符时 超出有限的范围(见下文),通常建议避免 尽可能使用保留关键字作为列或表标识符, 避免引用问题

但也有这样一种情况,标识符既不能是保留关键字,也不能包含空格或超出限制集的字符,但必须在其周围加上反勾号

范例

123E10是一个有效的标识符名称,但也是一个有效的整数文本

[没有详细说明如何获得这样的标识符名称],假设我要创建一个名为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
不使用反勾号时出错

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

除了所有解释得很好的答案之外,还没有提到以下内容,我经常访问此问答

简而言之;MySQL认为您需要对自己的表/列进行计算,并将连字符(如电子邮件)解释为电子邮件减去邮件


免责声明:因此,我想我会将此添加为仅供参考的答案,以供那些对数据库完全陌生且可能不理解已经描述的技术术语的人参考。

SQL Server和MySQL、PostgreySQL、Oracle不理解双引号。因此,您的查询应该没有双引号,并且应该只使用单引号

Back trip`在SQL中是可选的,用于表名、数据库名和列名

如果您试图在后端编写查询以调用MySQL,则可以使用双引号或单引号将查询分配给变量,如:

let query = "select id, name from accounts";
//Or
let query = 'select id, name from accounts';
如果查询中有where语句和/或试图插入一个值和/或一个字符串值更新,请对这些值使用单引号,如:

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\'';
双引号或单引号的问题出现在我们必须动态分配一些值并执行一些字符串串联时,如:

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 + '\'';

如果需要进一步的许可,请遵循

有时不使用引号是有用的。。。因为这会突出显示生成查询的代码中的问题。。。例如:

Use `database`;
其中x和y应始终为整数

从x=和y=0的表格中选择*


是SQL语法错误。。。有点懒惰,但可能有用…

但单引号更为其他RDBMS广泛接受-SQL标准定义并要求对字符串文字使用单引号这不是真的:MySQL还希望日期和日期时间文字值作为字符串单引号引用,如“2001-01-01 00:00:00”@evireiko MySQL文档似乎不这样做地址别名引用清楚。它将接受别名的single、double或backtick,但这可能会受到不同ANSI SQL模式的影响。我不确定SQL规范对别名引号的要求是什么-个人偏好:为了一致性,我将它们引用为与列标识符相同的值-也就是说,如果需要,我要么反勾选它们,要么不勾选它们。我不在别名上使用单引号或双引号。@guneyossan是的,非常脆弱。永远不要将变量用于表名,除非它已根据可接受的表名列表进行了验证-创建一个允许的名称数组,并检查变量是否与列表中的某些内容匹配,以确保使用安全。否则,您将无法安全地转义表名变量以供使用。Michael现在已全部排序,谢谢。我建议编辑图表以添加绑定变量。这是绝对华丽的,如果另一个可怜的灵魂出现在检查:无论什么,这将是更可爱。因此,ATB双引号是灵活的,但不能用作标识符。请永远不要在查询中直接使用未转义的用户输入@jankal这只是一个例子。我指定,如果您使用的是直接用户输入,则n然后……….@vipulsorathiya请在您的回答中指定POST变量应转义。现在,您的目标是在查询中直接使用它们。对于尝试这个的初学者来说不好…请注意,这是一个非常特定于MySQL的问题。一般来说,SQL即ISO/ANSI SQL有一组不同的引号:双引号用于分隔标识符,例如tablename,单引号用于文本,例如“这是一个文本”。标准SQL中从不使用回勾。如果需要在标识符中包含双引号,请将其键入oddtablename的两倍。类似地,在文本中使用双单引号,如“Conan OBrien”。或者,在ANSI_quotes模式下运行MySQL,使SQL技能集更具可移植性,并使用“字符串”作为标识符,而不使用反勾号。坚持标准总是好的