Mysql存储过程:匹配列规则以检索值
我有一个存储过程,它的功能是根据与Mysql存储过程:匹配列规则以检索值,mysql,stored-procedures,where-clause,operator-keyword,Mysql,Stored Procedures,Where Clause,Operator Keyword,我有一个存储过程,它的功能是根据与ColumnRule匹配的输入参数检索ColumnProperty 比如说, 我将执行以下命令,以将列属性作为字符串(short)获取。但问题是,当使用WHERE来筛选ColumnRule时,检索到的值是string,并在末尾获取未知类型 CALL `testing-spGetColumnType`('varchar(11)', @outputProperty); select @outputProperty; DELIMITER $$ CREATE PROC
ColumnRule
匹配的输入参数检索ColumnProperty
比如说,
我将执行以下命令,以将列属性
作为字符串(short)获取。但问题是,当使用WHERE来筛选ColumnRule
时,检索到的值是string,并在末尾获取未知类型
CALL `testing-spGetColumnType`('varchar(11)', @outputProperty);
select @outputProperty;
DELIMITER $$
CREATE PROCEDURE `testing-spGetColumnType`(IN pColumnType varchar(50),OUT pColumnProperty varchar(50))
BEGIN
SELECT ColumnProperty FROM model_column_type where pColumnType like replace(ColumnRule, 'variable', pColumnType) into pColumnProperty;
SELECT IFNULL(pColumnProperty,'unknown type') into pColumnProperty;
END$$
DELIMITER ;
示例表:
当WHERE子句中的条件根据
stringShort
行计算时,给定'varchar(11)
作为参数,它相当于
WHERE 'varchar(11)'
LIKE '%varchar% and SUBSTRING_INDEX(SUBSTRING_INDEX(varchar(11),''('',-1),'')'',1) < 50'
是一种价值。它看起来像SQL文本并不重要。在SELECT语句的上下文中,它只是一个字符串。这是一个字符串值。它不是对标识符、SQL函数或布尔运算符的引用
如果ColumnRule
值为
%varchar% one two buckle my shoe
为了获得一个字符串值作为SQL文本,我们可以使用动态准备的SQL 在MySQL过程的上下文中,我们可以动态创建SQL文本并将其存储为字符串,然后执行该字符串,如下所示:
SET @foo = ' foo, bar' ;
SET @sql = CONCAT('SELECT ',@foo,' FROM mytab',' ORDER BY ',@foo);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
警告:如果我们动态创建SQL文本,并合并潜在的不安全值,我们可能会打开一个巨大的SQL注入漏洞,就像一个小Bobby表
MySQL引用它不会将
ColumnRule
中的代码作为SQL表达式执行。它只是一个字符串,正在与pColumnType
进行匹配。回显Barmar:ColumnRule列中的值是一个值。字符串值看起来像SQL表达式一点都不重要。在SELECT语句中引用了它,它只是一个字符集合。要获得解释为SQL文本的值(并打开潜在的巨大SQL注入漏洞),我们需要动态生成SQL。。我们可以将该值合并到一个字符串中,然后将该字符串作为SQL语句执行,准备、执行、释放。。。MySQL参考:
SET @foo = ' foo, bar' ;
SET @sql = CONCAT('SELECT ',@foo,' FROM mytab',' ORDER BY ',@foo);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;