// Same thing with some variable replacements
// Here, a variable table name $table is backtick-quoted, and variables
// in the VALUES list are single-quoted
$query = "INSERT INTO `$table` (`id`, `col1`, `col2`, `date`) VALUES (NULL, '$val1', '$val2', '$date')";
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
11条答案
按热度按时间bfhwhh0e1#
反勾号用于表和列标识符,但只有当标识符是mysql保留关键字时,或者当标识符包含空格字符或超出有限集的字符时(见下文),才有必要使用反勾号。通常建议尽可能避免使用保留关键字作为列或表标识符,避免引用问题。
单引号应用于字符串值,如
VALUES()
列表mysql对字符串值也支持双引号,但其他rdbms更广泛地接受单引号,因此使用单引号而不是双引号是一个好习惯。mysql也期望
DATE
及DATETIME
文字值作为字符串单引号,如'2001-01-01 00:00:00'
. 有关更多详细信息,请参阅日期和时间文字文档,特别是使用连字符的替代方法-
作为日期字符串中的段分隔符。因此,使用您的示例,我将双引号引php字符串,并对值使用单引号
'val1', 'val2'
.NULL
是一个mysql关键字,是一个特殊的(非)值,因此不带引号。这些表或列标识符都不是保留字,也没有使用需要引用的字符,但我还是用反勾号引用了它们(稍后将详细介绍…)。
rdbms固有的功能(例如,
NOW()
在mysql中)不应被引用,尽管它们的参数受前面提到的相同字符串或标识符引用规则的约束。变量插值
变量的引号模式不会改变,尽管如果您打算直接在字符串中插入变量,它必须在php中双引号。只需确保已正确转义了sql中使用的变量(建议改用支持预处理语句的api,以防止sql注入)。
准备好的发言
使用准备好的语句时,请查阅文档以确定是否必须引用语句的占位符。php、pdo和mysqli中最流行的API除了不带引号的占位符外,其他语言中最常用的语句API也是如此:
标识符中需要回勾引用的字符:
根据mysql文档,您不需要使用以下字符集引用(反勾选)标识符:
ascii码:
[0-9,a-z,A-Z$_]
(基本拉丁字母,数字0-9,美元,下划线)您可以使用该集合之外的字符作为表或列标识符,例如包括空格,但必须引用(反勾选)它们。
此外,尽管数字是标识符的有效字符,但标识符不能仅由数字组成。如果他们这样做了,他们必须被包裹在背上。
wz1wpwve2#
mysql中有两种类型的引号:
'
用于封闭字符串文字用于封装标识符,如表名和列名 还有 `"` 这是一个特例。根据mysql服务器的性能,它可以一次用于上述目的之一 `sql_mode` : 默认情况下 `"` 字符可以用来括起字符串文字,就像 `'` 在里面 `ANSI_QUOTES` 模式 `"` 字符可以用来括起标识符,就像
####根据sql模式,以下查询将产生不同的结果(或错误):ansi_引号已禁用
查询将选择字符串文本
"column"
where列foo
等于字符串"bar"
####启用ansi_引号查询将选择该列
column
where列foo
等于列bar
####什么时候用什么我建议你避免使用
"
这样您的代码就独立于sql模式了始终引用标识符,因为这是一种很好的做法(有很多问题需要讨论)
sy5wg1nm3#
(关于问题的sql性质,上面有很好的答案,但如果您是php新手,这也可能是相关的。)
也许有一点很重要,php处理单引号字符串和双引号字符串的方式不同。。。
单引号字符串是“文本”,几乎是wysiwyg字符串。双引号字符串由php解释为可能的变量替换(php中的反勾号不完全是字符串;它们在shell中执行命令并返回结果)。
示例:
lf3rwulv4#
反勾号通常用于表示
identifier
同时也要避免意外使用保留关键字。例如:
这里的倒勾将帮助服务器理解
database
实际上是数据库的名称,而不是数据库标识符。表名和字段名也可以这样做。如果用反勾号 Package 数据库标识符,这是一个非常好的习惯。
检查此答案以了解有关回跳的更多信息。
现在谈谈双引号和单引号(michael已经提到了这一点)。
但是,要定义值,必须使用单引号或双引号。让我们看另一个例子。
在这里,我故意忘记了 Package
title1
引用。现在服务器将接受title1
作为列名(即标识符)。因此,要表示它是一个值,必须使用双引号或单引号。现在,与php结合使用,双引号和单引号使您的查询编写时间变得更加轻松。让我们在您的问题中查看查询的修改版本。
现在,在php中使用双引号,您将使变量
$val1
,及$val2
使用它们的值从而创建完全有效的查询。喜欢将使
jutyujz05#
在mysql中,这些符号用于分隔查询
, `"` , `'` 及 `()` . `"` 或 `'` 用于封闭类似字符串的值 `"26-01-2014 00:00:00"` 或 `'26-01-2014 00:00:00'` . 这些符号仅用于字符串,而不用于聚合函数,如 `now` , `sum` 或 `max` .
用于封闭表名或列名,例如。select
column_name
fromtable_name
where id='2'(
及)
只需将查询的部分括起来,例如。select
column_namefrom
table_namewhere (id='2' and gender='male') or name='rakesh'
.weylhg0b6#
mysql和php中的字符串文本是相同的。
字符串是一个字节或字符序列,包含在单引号(“”)或双引号(“”)字符中。
因此,如果字符串包含单引号,则可以使用双引号引用字符串,或者如果字符串包含双引号,则可以使用单引号引用字符串。但是,如果字符串同时包含单引号和双引号,则需要转义用于引用字符串的引号。
通常,我们对sql字符串值使用单引号,因此需要对php字符串使用双引号。
您可以在php的双引号字符串中使用一个变量:
但如果
$val1
或$val2
包含单引号,这将使sql出错。因此,在sql中使用它之前,需要对其进行转义;那是什么mysql_real_escape_string
这是给你的(尽管事先准备好的声明更好。)q8l4jmvw7#
在php和mysql的组合中,双引号和单引号使您的查询编写时间变得非常简单。
现在,假设您正在mysql查询中使用一个direct post变量,那么可以这样使用它:
这是在mysql中使用php变量的最佳实践。
0md85ypi8#
这里有许多有用的答案,通常归结为两点。
在标识符名称周围使用倒勾(
)。 单引号(')用于值周围。 正如@michaelberkowski所说 反勾号用于表和列标识符,但仅当标识符为
MySQL保留关键字,或者当标识符包含空格字符或超出有限集的字符(见下文)时,通常建议尽可能避免使用保留关键字作为列或表标识符,以避免引用问题。 但也有这样一种情况,标识符既不能是保留关键字,也不能包含空格或超出限制集的字符,但必须在其周围加上反勾号。 例子
123E10是有效的标识符名称,但也是有效的
INTEGER字面意义的。 [没有详细说明如何获得这样一个标识符名称],假设我要创建一个名为
123456e6` .反勾号没有错误。
不使用反勾号时出错。
然而,
123451a6
是一个非常好的标识符名称(没有回标记)。这完全是因为
1234156e6
也是一个指数。e5nqia279#
如果表COL和值是变量,则有两种方法:
双引号
""
完整查询:或
单引号
''
:使用背面记号 ```` 当列/值名称类似于mysql保留关键字时。
注意:如果用表名表示列名,请使用如下反勾号:
table_name
.column_name
<--注:排除.
从背部蜱虫。rryofs0p10#
单引号应用于字符串值,如values()列表中的字符串值。
反勾号通常用于指示标识符,并防止意外使用保留关键字。
在php和mysql的组合中,双引号和单引号使您的查询编写时间变得非常简单。
piztneat11#
除了所有的(解释得很好的)答案之外,还没有提到以下问题,我经常访问这个问答。
简而言之