MySQL - 在存储的 Function/Procedure 参数列表中使用或不使用“`”字符的区别

MySQL - Difference In Using The "`" Character Or Not in a Stored Function/Procedure Parameter List

下面是 MySQL 社区服务器版本 8.0.11 的两个存储过程。我看到一些存储过程使用反引号以第一种方式编写:`,参数列表和查询语句中的字符。但是,我也看到像第二个查询那样没有反引号字符的查询。

最好遵循哪种方式?它们有任何安全差异吗?如果在存储过程中使用反引号字符,它们是否更容易受到 SQL 注入攻击?

CREATE PROCEDURE `procedure`(IN `in_data` VARCHAR(100))
BEGIN
    SELECT COUNT(*) FROM `table_name` WHERE `data` = `in_data`;
END

或者:

CREATE PROCEDURE `procedure`(IN in_data VARCHAR(100))
BEGIN
    SELECT COUNT(*) FROM table_name WHERE data = in_data;
END

我希望我说得足够清楚,谢谢你的时间。

只要您的程序不使用 PREPAREEXECUTE 执行动态 SQL,查询就是固定的,它们不会受到 SQL 注入的攻击。

反引号用于分隔标识符(table 名称、列名称、过程名称等)以允许您使用不合法的标识符,因为它们包含标点符号或白色space 或国际字符或与 SQL 保留字冲突。

例子见我对这个问题的回答:Do different databases use different name quote?