Perl DBD :: MySQL execute не поддерживает строковый параметр после ключевого слова limit.Всегда рассматривается как число - PullRequest
0 голосов
/ 08 февраля 2019

Недавно мы установили новую ОС с новейшими 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
, либо, чтобы принудительно указать конкретный тип параметра как строку?

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Включает ли ваша обновленная ОС более новую версию MySQL?Документация для UNION в MySQL гласит:

Чтобы применить ORDER BY или LIMIT к отдельному SELECT, поместите предложение в скобки, которые заключают в себе SELECT:

(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);

И это:

Чтобы использовать предложение ORDER BY или LIMIT для сортировки или ограничения всего результата UNION, заключите в скобки отдельные операторы SELECT и поместите ORDER BY или LIMIT послепоследний.В следующем примере используются оба предложения:

(SELECT a FROM t1 WHERE a=10 AND B=1)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2)
ORDER BY a LIMIT 10;

Поэтому я думаю, что вам нужно добавить несколько скобок в ваш SQL.

0 голосов
/ 08 февраля 2019

Анализ команд, содержащих LIMIT, содержит ошибки.Вместо этого попробуйте DBD :: MariaDB , который, мы надеемся, уже устранил проблему ( здесь ).

...