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

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

例如:

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

此外,在上面的例子中,考虑表, COL1, Val1 等可以是变量。

这个标准是什么?你是做什么的

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

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

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

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

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

这些表或列标识符都不是保留字,也没有使用需要引用的字符,但我还是用反勾号引用了它们(稍后将详细介绍…)

RDBMS固有的函数(例如,MySQL中的NOW())不应该被引用,尽管它们的参数遵循前面提到的相同字符串或标识符引用规则

倒勾(`)
表和列───────┬─────┬──┬──┬──┬────┬──┬────┬──┬────┬──┬───────┐
↓     ↓  ↓  ↓  ↓    ↓  ↓    ↓  ↓    ↓  ↓       ↓
$query=“插入“表”(`id`、`col1`、`col2`、`date`、`updated`)
值(NULL,'val1','val2','2001-01-01',NOW())“;
↑↑↑↑  ↑    ↑  ↑    ↑  ↑          ↑  ↑↑↑↑↑ 
不带引号的关键字─────┴┴┴┘  │    │  │    │  │          │  │││││
单引号(')字符串───────────┴────┴──┴────┘  │          │  │││││
单引号(')日期───────────────────────────┴──────────┘  │││││
无引号函数─────────────────────────────────────────┴┴┴┴┘    

变量插值

变量的引号模式不会改变,尽管如果您打算直接在字符串中插入变量,它必须在PHP中双引号。只需确保已正确转义了SQL中使用的变量。(建议改用支持预处理语句的API,以防止SQL注入)

//有些变量替换也是一样的
//这里,变量表名$table被反勾引,变量
//值列表中的值是单引号
$query=“插入到`$table`(`id`、`col1`、`col2`、`date`)值(空,'$val1''$val2''$date');

准备好的发言

使用准备好的语句时,请查阅文档以确定是否必须引用语句的占位符。PHP、PDO和MySQLi中最流行的API,除了无引号的占位符之外,其他语言中最流行的语句API也是如此:

//带有命名参数的PDO示例,不带引号
$query="在`表'(`id`、`col1`、`col2`、`date`)中插入值(:id、:col1、:col2、:date)";
//MySQLi的例子是什么?参数,无引号
$query="在“表”(`id`、`col1`、`col2`、`date`)中插入值(?、、?、?)”;;

标识符中需要回勾引用的字符:

根据MySQL文档,您不需要使用以下字符集引用(反勾选)标识符:

ASCII:[0-9,a-z,a-z$”(基本拉丁字母,数字0-9,美元,下划线)

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

此外,尽管数字是标识符的有效字符,但标识符不能仅由数字组成。如果他们这样做了,他们必须被包裹在背上

发表评论