Рейтинг:0

Устаревшая поддержка Mariadb

флаг cn

У меня есть старая версия сайта php, которая использует неэкранированный номер столбца row_number в своих запросах sql. Кажется, в новой версии mariadb была добавлена ​​новая функция с именем «row_number ()», и поэтому запросы не выполняются. О рефакторинге всего проекта не может быть и речи. Также я не хочу докеризовать все это со старой версией mariadb. Есть ли способ использовать новый mariadb, но также использовать старый синтаксис/набор функций, чтобы не было конфликтов?

Спасибо.

флаг ua
Я думаю, вам нужно стиснуть зубы и отредактировать все файлы. Если вы работаете в Linux, вы можете написать скрипт `sed` (думаю, однострочный), чтобы все редактирование выполнялось одной командой. (Я не знаю эквивалентного инструмента в Windows.)
Рейтинг:1
флаг ua

В Linux (или аналогичном) одна команда может добавить обратные ссылки ко всем вашим файлам.

Внимание: не используйте это без предварительного тщательного тестирования:

sed -i 's/номер_строки/\`номер_строки\`/ig *

Примечания:

-i -- обновить файл на месте
\ -- нужно избегать того, чтобы обратные ссылки действовали оболочкой
я -- игнорировать регистр
g -- обрабатывать несколько вхождений в строке
* -- измените, чтобы указать файлы, которые могут нуждаться в редактировании
флаг cn
добавление кавычек более опасно, чем переименование столбца и переменных, хотя это также довольно трудоемко. Кроме того, sed определенно не идеален для этой задачи, я бы рекомендовал vscode и его функцию замены - если кому-то будет интересен такой подход. Тем не менее, я не думаю, что хочу идти по этому пути - по крайней мере, сейчас. Если для mariadb нет уровня совместимости, я мог бы подумать об этом.
Рейтинг:1
флаг cn

Одним из способов решения подобных проблем является использование фильтр регулярных выражений в MariaDB MaxScale. Если вы знаете, что приложение использует ROW_NUMBER имя определенным образом, вы можете определить регулярное выражение, которое соответствует ему и заменяет его версией в кавычках.

Очевидным недостатком этого подхода является то, что регулярные выражения довольно сложно подобрать правильно, и их нелегко поддерживать, если сопоставляемый шаблон становится сложным. Однако это может позволить вашему приложению работать, пока вы работаете над обновлением приложения до более новой версии.

Вот пример настройки фильтра:

[Фильтр регулярных выражений]
тип=фильтр
модуль = фильтр регулярных выражений
совпадение=/ROW_NUMBER/
заменить=/`ROW_NUMBER`/
Рейтинг:0
флаг cn

Также я не хочу докеризовать все это со старой версией мариадб.

Хороший. Бессрочное использование старых версий — это больше работы, чем думает большинство людей. Обновления безопасности закончатся, вам нужно будет найти альтернативу, например, купить поддержку у того, кто может исправить исправления.Что трудно найти умение. И тогда вы застряли на старой версии и не получаете новых функций.

Есть ли способ использовать новый mariadb, но также использовать старый синтаксис/функцию настроить так, чтобы не было столкновений?

Нет, row_number — это оконная функция, которая существует во всех поддерживаемых версиях MariaDB. К сожалению, вы выбрали имя первым, но row_number является соглашением среди реализаций SQL.

Как вы сказали, цитирование - это один синтаксис для устранения двусмысленности. Это будет относительно небольшой проект по рефакторингу, без изменения поведения и необходимости касаться данных или схемы. Если разработчики вашего сайта этого не сделают, какое еще более сложное обслуживание не получит код?

флаг ua
И если бы это было не "номер_строки", это могло бы быть что-то еще. И следующая версия получит какое-то другое имя, которое вы можете использовать.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.