, когда условие в предложении WHERE оценивается по строке stringShort
, в качестве аргумента которой указывается 'varchar(11)'
, это эквивалентно
WHERE 'varchar(11)'
LIKE '%varchar% and SUBSTRING_INDEX(SUBSTRING_INDEX(varchar(11),''('',-1),'')'',1) < 50'
и результат сравнения LIKE
будетFALSE.
Значение из ColumnRule
из этой строки
%varchar% and SUBSTRING_INDEX(SUBSTRING_INDEX(variable,'(',-1),')',1) < 50
является значением . Неважно, что это похоже на текст SQL. В контексте оператора SELECT это просто строка символов. Это строка значение . Это не ссылки на идентификаторы или функции SQL, или логические операторы.
Мы получили бы тот же результат, если бы значение ColumnRule
было
%varchar% one two buckle my shoe
Чтобы получить строковое значение, которое будет отображаться как текст SQL, мы можем использовать динамически подготовленный SQL.
В контексте MySQL PROCEDURE мы можем динамически создавать текст 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-инъекций, как, например, Little Bobby Tables https://xkcd.com/327/
MySQL Reference https://dev.mysql.com/doc/refman/8.0/en/sql-syntax-prepared-statements.html