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

例子:

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

此外,在上面的例子中,考虑table, col1, val1等可能是变量.

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

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

推荐答案

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

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

MySQL还希望DATEDATETIME个文本值都是单引号字符串,比如'2001-01-01 00:00:00'.有关更多详细信息,请参阅the Date and Time Literals文档,特别是在日期字符串中使用连字符-作为段分隔符的替代方法.

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

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

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

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中使用的变量.(It is recommended to use an API supporting prepared statements instead, as protection against SQL injection).

// 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')";

准备好的声明

使用准备好的语句时,请查阅文档,以确定是否必须引用语句的占位符.PHP、PDO和MySQLi中最流行的API预计有unquoted个占位符,其他语言中最常用的语句API也是如此:

// PDO example with named parameters, unquoted
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (:id, :col1, :col2, :date)";

// MySQLi example with ? parameters, unquoted
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (?, ?, ?, ?)";

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

According to MySQL documentation,则不需要使用以下字符集引用(反勾选)标识符:

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

您可以使用该集合之外的字符作为表或列标识符,例如,包括空格,但随后您可以对它们进行must引号(倒勾).

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

Mysql相关问答推荐

MySQL添加表会将&@@&qot;追加到表名

递归查询意外地为一个字段返回空值

版本升级到5.0.0后在QueryDSL中使用Enum时出错

PythonAnywhere中SSH到MySQL数据库无限期挂起,SSH正确,workbench可以完美连接

根据名称将值从一个字段复制到不同记录的同一字段

替代对多个表执行 FULL OUTER JOIN?

如何在 Shopware 6 DAL 中实施 Haversine 公式?

如何根据 R 中的价格范围将数据从一列复制到新列?

从 mysql RDS 导出数据以导入 questDb

当查询 MySQL 的 goroutine 过多时,Go 会出现panic

如何在 MySQL 中删除具有 2 列作为复合主键的多行?

MySQL Group By 和 Sum 其他列的总值

没有 JDBC 类型的方言映射:1111

错误 1396 (HY000): 'user'@'localhost' 的操作 DROP USER 失败

MYSQL:创建表中的索引关键字以及何时使用它

如何在 MySQL 上一次删除一系列记录?

如何为 php 启用 mysqlnd?

MySQL 整数与日期时间索引

MySQL更新查询与左连接和分组依据

匹配 IN 子句中的所有值