我有舊版的 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 實作之間的約定。
正如您所說,引用是解決歧義的一種語法。這將是一個相對較小的重構項目,沒有行為改變,也不需要接觸資料或模式。如果您網站的開發人員不這樣做,那麼程式碼還沒有得到其他哪些更複雜的維護?