У меня старая версия сайта php, которая использует неэкранированный номер столбца 'row_number' в своих SQL-запросах. Кажется, в новой версии mariadb была добавлена новая функция под названием "row_number()", и поэтому запросы не выполняются. Рефакторинг всего проекта невозможен. Кроме того, я не хочу все это докеризировать со старой версией mariadb. Есть ли способ использовать новый mariadb, но также использовать старый синтаксис/набор функций, чтобы не было коллизий?
Спасибо.
решение1
В Linux (или аналогичной системе) одна команда может добавить обратные сноски во все ваши файлы.
Внимание: не используйте это без предварительного тщательного тестирования:
sed -i 's/row_number/\`row_number\`/ig *
Примечания:
-i -- update file in-place
\ -- need to avoid the backtics being acted on by the shell
i -- ignore case
g -- handle multiple occurrences in a line
* -- change to specify the files that might need editing
решение2
Одним из способов решения подобных проблем является использованиефильтр регулярных выраженийв MariaDB MaxScale. Если вы знаете, что приложение использует имя ROW_NUMBER
определенным образом, вы можете определить регулярное выражение, которое сопоставляет его и заменяет его на указанную версию.
Очевидный недостаток этого подхода заключается в том, что регулярные выражения довольно сложно получить правильно и их нелегко поддерживать, если шаблон, который нужно сопоставить, становится сложным. Однако это может позволить вашему приложению работать, пока вы работаете над обновлением своего приложения до более новой версии.
Вот пример настройки фильтра:
[RegexFilter]
type=filter
module=regexfilter
match=/ROW_NUMBER/
replace=/`ROW_NUMBER`/
решение3
Кроме того, я не хочу все это докеризировать с помощью старой версии mariadb.
Хорошо. Бесконечное использование старых версий требует больше работы, чем большинство людей осознает. Обновления безопасности прекратятся, вам придется искать альтернативу, например, покупать поддержку у кого-то, кто может переносить исправления. Это трудно найти. И тогда вы застрянете на старой версии и не получите новых функций.
Есть ли способ использовать новый MariaDB, но при этом использовать старый синтаксис/набор функций, чтобы не возникало коллизий?
Нет, row_number — это оконная функция, котораясуществует во всех поддерживаемых версиях MariaDB. Жаль, что вы первым выбрали имя, но row_number — это соглашение среди реализаций SQL.
Цитирование — это один из синтаксисов для разрешения неоднозначности, как вы сказали. Это был бы относительно небольшой проект рефакторинга, без изменения поведения и без необходимости трогать данные или схему. Если разработчики вашего сайта не будут этого делать, какое еще более сложное обслуживание не получит код?