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;