我有旧版本的 php 网站,它在 sql 查询中使用未转义的“row_number”列号。似乎在新版本的 mariadb 中增加了名为“row_number()”的新函数,因此查询失败。重构整个项目是不可能的。而且我不想用旧版本的 mariadb 将整个项目 dockerize。有没有办法使用新的 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 将整个东西 dockerize 起来。
很好。无限期地使用旧版本比大多数人意识到的要费力得多。安全更新将结束,您需要找到替代方案,例如从可以反向移植修复程序的人那里购买支持。这是一项很难找到的技能。然后您就只能使用旧版本,无法获得新功能。
有没有办法使用新的 mariadb 同时使用旧的语法/函数集以避免冲突?
不,row_number 是一个窗口函数,存在于所有受支持的 MariaDB 版本中不幸的是您首先选择了名称,但 row_number 是 SQL 实现中的约定。
正如您所说,引用是一种解决歧义的语法。这将是一个相对较小的重构项目,不会改变行为,也不需要触及数据或架构。如果您网站的开发人员不这样做,那么代码还有什么其他更复杂的维护需要做呢?