何时在MySQL中使用单引号,双引号和反标号
我正在尝试学习编写查询的最佳方法。 我也明白一致的重要性。 到现在为止,我没有任何真正的想法,随机使用了单引号,双引号和回刻号。
例:
$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';
另外,在上面的例子中,考虑"table," "col[n]," and "val[n]"
可能是变量。
这是什么标准? 你是做什么?
我一直在阅读关于这里约20分钟的类似问题的答案,但似乎没有这个问题的明确答案。
反引号将用于表和列标识符,但仅当标识符是MySQL保留关键字时,或者标识符包含空白字符或超出受限集合的字符时才需要(见下文)。通常建议避免使用保留关键字尽可能作为列或表标识符,以避免引用问题。
单引号应该用于像VALUES()
列表中的字符串值。 MySQL的字符串值也支持双引号,但其他RDBMS更容易使用单引号,所以使用单引号而不是double是个好习惯。
MySQL还希望DATE
和DATETIME
字面值DATETIME
引号为'2001-01-01 00:00:00'
类'2001-01-01 00:00:00'
字符串。 有关更多详细信息,请参阅日期和时间文字文档,特别是使用连字符的替代方法-
作为日期字符串中的分隔符。
因此,使用您的示例,我会对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中使用的变量。 (建议使用支持预处理语句的API来防止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')";
准备好的陈述
处理准备好的陈述时,请查阅文档以确定陈述的占位符是否必须被引用。 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 (?, ?, ?, ?)";
需要在标识符中引用反引号的字符:
根据MySQL文档,您不需要使用以下字符集引用(反向)标识符:
ASCII: [0-9,az,AZ$_]
(基本拉丁字母,数字0-9,美元,下划线)
您可以使用超出该设置的字符作为表或列标识符,例如包括空格,但是您必须引用(反向)它们。
MySQL中有两种类型的引号:
'
用于包含字符串文字 `
用于包含表名和列名等标识符 然后是"
这是一个特殊情况,它可以用于上面提到的目的之一,具体取决于MySQL服务器的sql_mode
:
"
字符可以用来包含字符串文字,就像'
ANSI_QUOTES
模式下, "
字符可以像`
一样用于包含标识符 以下查询将根据SQL模式产生不同的结果(或错误):
SELECT "column" FROM table WHERE foo = "bar"
禁用ANSI_QUOTES
查询将选择字符串字面值"column"
,其中列foo
等于字符串"bar"
启用ANSI_QUOTES
查询将选择列column
,其中列foo
等于列bar
何时使用什么
"
以便你的代码独立于SQL模式 (关于你的问题的SQL性质,上面有很好的答案,但如果你是PHP新手,这也可能是相关的。)
也许有必要提到PHP处理单引号和双引号的字符串不同。
单引号字符串是'文字',几乎是所见即所得的字符串。 双引号字符串被PHP解释为可能的变量替换(PHP中的反引号不完全是字符串;它们在shell中执行命令并返回结果)。
例子:
$foo = "bar";
echo 'there is a $foo'; // There is a $foo
echo "there is a $foo"; // There is a bar
echo `ls -l`; // ... a directory list
链接地址: http://www.djcxy.com/p/93645.html
上一篇: When to use single quotes, double quotes, and back ticks in MySQL
下一篇: Can I escape a double quote in a verbatim string literal?