Недавно мы установили новую ОС с новейшими DBI MySQL, Perl и т. Д.
Этот паттерн обнаружил несколько наших приложений и ломается при установке на новую ОС.
my $sth = $dbh->prepare('select null colname, null colname2 limit 0'
. ' union all select x, y from tbl where col like ?'
. ' union all select z, a from tbl2 where col like ?');
$sth->execute('%test%', '%test%') or die ...;
Ошибка - синтаксическая ошибка MySQL.Мы определили проблему в том, как параметры заключаются в кавычки.
В приведенном выше примере это разрешается так же в MySQL.
select null colname, null colname2 limit 0
union all select x, y from tbl where col like
union all select z, a from tbl2 where col like
Однако, если '%test%'
заменяется нацифры (например, '555'
), он проходит.
select null colname, null colname2 limit 0
union all select x, y from tbl where col like 555
union all select z, a from tbl2 where col like 555
Обратите внимание на отсутствие кавычек.
Мы определили это как наличие ключевого слова limit
.Удаление ключевого слова решает синтаксическую ошибку.
select null colname, null colname2
union all select x, y from tbl where col like '%test%'
union all select z, a from tbl2 where col like '%test%'
Кроме того, установка '555'
в Perl теперь приводит к '555'
в MySQL с кавычками.
Мы обнаружили, что с использованием производной таблицыэто самый быстрый способ разрешения прямо сейчас,
select * from (select null colname, null colname2 limit 0)a
union all select x, y from tbl where col like '%test%'
union all select z, a from tbl2 where col like '%test%'
(пробовал только в скобках, но для работы нужна производная таблица), но мне любопытно, есть ли способ управления методом цитат через DBI / DBD ::Интерфейс MySQL вместо.(избегая обновления оператора)
Либо измените поведение по умолчанию, чтобы отключить логику ключевого слова limit
, либо, чтобы принудительно указать конкретный тип параметра как строку?