1

すべてのmysqlクエリが文字列から接着されている古いシステム(何年も前に書かれた)を改善しようとしています。そのクエリの例は次のようになります

"SELECT * FROM User WHERE id > '3'"

Id 列はもちろん bigint と PK です。

idがint値でなければならないクエリで、mysqlは「3」で何をしますか? これは文字列として扱われるため ('' により)、この値は mysql による分析/最適化プロセス中に int にキャストされると想定しています。私は正しいですか?

//UPDATEおそらく間違った方法で尋ねました。対処方法は2つあります。

  1. (高速) Mysql は id が int であることを自動的に検出し、クエリを書き換え/キャストします。

     SELECT * FROM User WHERE id > 3
    

    DBエンジンに送信する前に

  2. (信じられない) Mysql は

    SELECT * FROM
    

    次に、ループで条件WHERE id > '3'を適用し、すべての行にキャストします

2番目のオプションが不可能であることを確認したいだけです。

4

2 に答える 2

1

MySQL は、それを正しい列タイプに自動的にキャストします。何らかの理由でそれができない場合は、エラーがスローされます。

パラメーターが安全でないソース (ユーザー、外部 API) から取得される可能性がある場合は常に、PDO または MySQLi で準備済みステートメントを使用してください。

于 2012-07-27T22:23:32.417 に答える
1

MySQL は比較のために常に文字列を数値にキャストします。この場合、これは正しいことです (列のインデックスを使用して値を見つけます)。
列が文字列で、それを整数定数と比較すると、MySQL は列を整数にキャストし、インデックスを使用しません。

于 2012-07-27T22:31:59.067 に答える