Mariadb レガシーサポート

Mariadb レガシーサポート

私は古いバージョンの PHP サイトを持っていますが、その sql クエリではエスケープされていない 'row_number' 列番号を使用しています。新しいバージョンの mariadb では、"row_number()" という新しい関数が追加されているため、クエリが失敗するようです。プロジェクト全体をリファクタリングするのは論外です。また、古いバージョンの mariadb で全体を dockerize したくありません。新しい mariadb を使用しながら、衝突が起こらないように古い構文/関数セットも使用する方法はあるでしょうか?

ありがとう。

答え1

Linux (または類似の言語) では、1 つのコマンドですべてのファイルにバックティックを追加できます。

注意: 事前に徹底的にテストせずにこれを使用しないでください。

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

このような問題を回避する方法の1つは、正規表現フィルタMariaDB MaxScale では、アプリケーションがROW_NUMBER名前を特定の方法で使用していることがわかっている場合は、それに一致する正規表現を定義して、引用符で囲んだバージョンに置き換えることができます。

このアプローチの明らかな欠点は、正規表現を正しく理解するのがやや難しく、一致させるパターンが複雑になると維持するのが難しくなることです。ただし、これにより、アプリケーションを新しいバージョンに更新する作業中でもアプリケーションを動作させることができる可能性があります。

フィルターの設定例を次に示します。

[RegexFilter]
type=filter
module=regexfilter
match=/ROW_NUMBER/
replace=/`ROW_NUMBER`/

答え3

また、古いバージョンの mariadb を使用して全体を docker 化したくありません。

いいですね。古いバージョンを無期限に使用するのは、ほとんどの人が思っている以上に手間がかかります。セキュリティ更新は終了するので、修正をバックポートできる人からサポートを購入するなどの代替手段を見つける必要があります。これは見つけるのが難しいスキルです。そして、古いバージョンに固執し、新しい機能を入手できなくなります。

新しい mariadb を使用しながら、衝突が起こらないように古い構文/関数セットも使用する方法はありますか?

いいえ、row_numberはウィンドウ関数であり、MariaDBのサポートされているすべてのバージョンに存在する最初に名前を選んだのは残念ですが、 row_number は SQL 実装間の慣例です。

おっしゃるとおり、引用符はあいまいさを解決するための 1 つの構文です。これは比較的小さなリファクタリング プロジェクトで、動作の変更はなく、データやスキーマに触れる必要もありません。サイトの開発者がこれを行わない場合、コードが受けていない他の複雑なメンテナンスは何でしょうか?

関連情報