我正在尝试学习编写查询的最佳方法 . 我也理解保持一致的重要性 . 到现在为止,我已经随机使用单引号,双引号和后退,而没有任何实际想法 .
例:
$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';
此外,在上面的示例中,请考虑 "table," "col[n]," and "val[n]"
可能是变量 .
这是什么标准?你是做什么?
我已经在这里阅读了类似问题的答案大约20分钟,但似乎这个问题没有明确的答案 .
12 回答
反引号用于表和列标识符,但仅在标识符为MySQL reserved keyword时,或者当标识符包含空格字符或超出限制集的字符时才需要(见下文) . 通常建议避免使用保留关键字作为列或尽可能使用表格标识符,避免引用问题 .
单引号应该用于
VALUES()
列表中的字符串值 . MySQL也支持双引号用于字符串值,但单引号被其他RDBMS更广泛地接受,因此使用单引号而不是双引号是一个好习惯 .MySQL还希望
DATE
和DATETIME
文字值作为字符串单引,如'2001-01-01 00:00:00'
. 有关更多详细信息,请参阅the Date and Time Literals文档,特别是在日期字符串中使用连字符-
作为段分隔符的替代方法 .因此,使用您的示例,我会双引号PHP字符串并在值
'val1', 'val2'
上使用单引号 .NULL
是MySQL关键字,是一个特殊(非)值,因此不带引号 .这些表或列标识符都不是保留字或使用需要引用的字符,但我还是用反引号引用它们(后面会详细介绍......) .
不应引用RDBMS本机函数(例如,MySQL中的
NOW()
),尽管它们的参数受到已经提到的相同字符串或标识符引用规则的约束 .变量插值
变量的引用模式不会改变,但如果您打算直接在字符串中插入变量,则必须在PHP中使用双引号 . 只需确保已正确转义变量以便在SQL中使用 . (It is recommended to use an API supporting prepared statements instead, as protection against SQL injection) .
准备好的陈述
使用预准备语句时,请查阅文档以确定是否必须引用语句的占位符 . PHP,PDO和MySQLi中最流行的API,与其他语言中的大多数预处理语句API一样,期望使用不带引号的占位符:
需要在标识符中引用反引号的字符:
According to MySQL documentation,您不需要使用以下字符集引用(反引号)标识符:
您可以使用除表之外的字符作为表或列标识符,例如包括空格,但是您必须引用(反引号)它们 .
MySQL中有两种类型的引号:
'
用于包含字符串文字然后有
"
这是一个特例 . 根据MySQL服务器的sql_mode,它可以一次用于上述目的之一:默认情况下,
"
字符可用于包含字符串文字,就像'
一样在ANSI_QUOTES模式下,
"
字符可用于包含标识符,如 ```以下查询将根据SQL模式生成不同的结果(或错误):
ANSI_QUOTES已禁用
查询将选择字符串文字
"column"
,其中foo
列等于字符串"bar"
ANSI_QUOTES已启用
该查询将选择列
column
,其中foo
列等于bar
列何时使用什么
我建议您避免使用
"
,以便您的代码独立于SQL模式始终引用标识符,因为这是一个很好的做法(关于SO的很多问题讨论这个)
(上面有关于你的问题的SQL性质的好答案,但如果你是PHP的新手,这也可能是相关的 . )
也许重要的是要提到PHP处理单引号和双引号字符串不同...
单引号字符串是'文字',几乎是WYSIWYG字符串 . PHP解释双引号字符串可能的变量替换(PHP中的反引号不完全是字符串;它们在shell中执行命令并返回结果) .
例子:
反引号通常用于指示
identifier
以及 safe 意外使用Reserved Keywords .例如:
这里的反引号将帮助服务器理解
database
实际上是数据库的名称,而不是数据库标识符 .同样可以做到表名和字段名 . 如果用反引号包装数据库标识符,这是一个非常好的习惯 .
现在关于双引号和单引号(迈克尔已经提到过) .
但是,要定义一个值,您必须使用单引号或双引号 . 让我们看另一个例子 .
在这里,我故意忘记用引号包装
title1
. 现在服务器将title1
作为列名(即标识符) . 因此,要表明它是一个值,您必须使用双引号或单引号 .现在,结合PHP,双引号和单引号使您的查询编写时间更容易 . 让我们在您的问题中看到查询的修改版本 .
现在,在PHP中使用双引号,您将使变量
$val1
和$val2
使用它们的值,从而创建一个完全有效的查询 . 喜欢会做的
基本上在Mysql中,有查询 ``` ,
"
,'
和()
这些标识符 ."
或'
用于封装字符串,如值"26-01-2014 00:00:00"
或'26-01-2014 00:00:00'
. 这些标识符仅用于字符串而非聚合函数,如now() or sum ,max
等 .``` 用于封闭表格或表格列,例如从
table_name
中选择column_name
,其中id = '2'()
仅用于封闭查询部分,例如从table_name
中选择column_name
(id = '2'和gender = 'male')或name = 'rakesh' .MySQL和PHP中的字符串文字是相同的 .
因此,如果您的字符串包含单引号,那么您可以使用双引号来引用字符串,或者如果它包含双引号,那么您可以使用单引号来引用字符串 . 但是,如果您的字符串包含单引号和双引号,则需要转义用于引用字符串的字符串 .
大多数情况下,我们对SQL字符串值使用单引号,因此我们需要对PHP字符串使用双引号 .
你可以在PHP的双引号字符串中使用一个变量:
但如果
$val1
或$val2
包含单引号,那将导致您的SQL出错 . 所以你需要在sql中使用之前将其转义;这就是mysql_real_escape_string
的用途 . (虽然准备好的陈述更好 . )结合PHP和MySQL,双引号和单引号使您的查询编写时间变得更加容易 .
现在,假设您正在使用直接post变量进入MySQL查询,请使用以下方式:
这是将PHP变量用于MySQL的最佳实践 .
如果表cols和values是变量,那么有两种方法:
双引号
""
完整查询:要么
单引号
''
:当列/值名称类似于MySQL保留关键字时,请使用返回标记 ```` .
Note: 如果您使用表名表示列名,请使用如下的返回标记:
table_name
.column_name
< - 注意:从后面的刻度中排除.
.这里有很多有用的答案,通常最终分为两点 .
BACKTICKS(`)用于标识符名称 .
SINGLE QUOTES(')用于值 .
和@MichaelBerkowski说
但是有一种情况,即标识符既不是保留关键字,也不包含超出限制集的空格或字符,但必须围绕它们进行反引号 .
例
123E10
是有效的标识符名称,但也是有效的INTEGER
文字 .[不详细说明如何获得这样的标识符名称],假设我想创建一个名为
123456e6
的临时表 .反推没有错误 .
不使用反引号时出错 .
但是,
123451a6
是一个非常精细的标识符名称(没有后退标记) .这完全是因为
1234156e6
也是一个指数 .单引号应该用于字符串值,如VALUES()列表中所示 .
反引号通常用于表示标识符,并且不会意外地使用保留关键字 .
结合PHP和MySQL,双引号和单引号使您的查询编写时间变得更加容易 .
除了所有(解释清楚的)答案之外,还没有提到以下内容,我经常访问此问答 .
简而言之; MySQL thinks you want to do math 在自己的表/列上并解释连字符,如"e-mail"as
e
minusmail
.Disclaimer: 所以我想我会把这个作为"FYI"类型的答案添加到那些对数据库工作完全陌生并且可能不理解已经描述的技术术语的人 .
SQL服务器和MySQL,PostgreySQL,Oracle不理解双引号(“) . 因此,您的查询应该没有双引号(”),并且应该只使用单引号(') .
回溯(`)是在SQL中使用的可选项,用于表名,数据库名和列名 .
如果您尝试在后端编写查询来调用MySQL,那么您可以使用双引号(“)或单引号(')将查询分配给变量,如:
如果你的查询中有一个
where
语句和/或尝试insert
一个值和/或一个update
的值,这是字符串使用单引号(')这些值,如:如果你想避免这种混淆何时使用双引号(“)和单引号('),建议坚持使用单引号('),这将包括反斜杠(),如:
当我们必须为动态分配一些值并执行一些字符串连接时,会出现double(“)或single(')引号的问题:
如果需要进一步清关,请遵循quotes in JavaScript