mysql - 在MySQL中,sql什么时候使用单引号双引号和反斜杠

  显示原文与译文双语对照的内容
108 4

我正在尝试学习写查询的最佳方法。我也知道保持一致的重要性。直到现在,我已经随机使用单引号。双引号和反斜杠,没有任何真正的。

例如:

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

此外,在上面的示例中,考虑"table,""col[n]," and"val[n]"可能是变量。

这个标准的标准是什么?你会怎么选择?

我在这里读到了约 20分钟的相似问题答案,但看起来这个问题没有明确的答案。

时间:原作者:0个回答

69 4

反斜杠用于 table 和列标识符,但只有在标识符为保留关键字,或者标识符在可能的情况下,如果标识符在可能的情况下避免使用保留关键字或者在可能的情况下避免引用问题。

单引号应用于 VALUES() 列表中的字符串值。MySQL支持双引号,但是单引号更广泛,因这里使用单引号而不是双引号是很好的习惯。

MySQL还期望 DATEDATETIME的文本值是单引号的,如 '2001-01-01 00:00:00'查询日期和时间Literals文档for更多细节,以 particular hyphen作为日期字符串中的段分隔符使用连字符的替代。

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

这些 table 或者列标识符都不是保留字或者者使用需要引用的字符,但是我引用了引号( 更多关于这个。) 。

不应引用,的函数,尽管它们的参数已经经引用了相同的字符串或者标识符引用规则。

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 ─────────────────────────────────────────┴┴┴┴┘ 

变量插值

变量的引用模式不会改变,尽管你打算直接在字符串中插入变量,但是它必须双引号。确保你已经正确地转义了变量以便在SQL中使用。( 建议使用API支持 prepared 语句,作为对 SQL注入 插件的保护) 。

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

Prepared语句

使用 prepared 语句时,请参考文档以确定语句的占位符是否必须引用。PHP,PDO和 MySQLi 中最流行的api,期望使用不带引号的占位符,像其他语言的大多数语句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 (?,?,?,?)";

字符requring引号在标识符中引用:

根据MySQL文档,你无需使用以下字符集引用( 反向引用) 标识符:

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

除了 table 或者列标识符之外,你还可以使用字符以外的字符,例如空格,但是你必须将它们引用为( 反向引用) 。

原作者:
...