いくつかのSQLブックを調べているうちに、例では疑問符(?
)クエリで。それは何を表していますか?
表示されているのは、パラメータ化されたクエリです。これらは、プログラムから動的SQLを実行するときに頻繁に使用されます。
たとえば、これを書く代わりに(note:pseudocode):
ODBCCommand cmd = new ODBCCommand("SELECT thingA FROM tableA WHERE thingB = 7")
result = cmd.Execute()
あなたはこれを書きます:
ODBCCommand cmd = new ODBCCommand("SELECT thingA FROM tableA WHERE thingB = ?")
cmd.Parameters.Add(7)
result = cmd.Execute()
おそらく明らかなように、これには多くの利点があります。最も重要なものの1つ:パラメーターを解析するライブラリー関数は賢く、文字列が適切にエスケープされるようにします。たとえば、次のように書くと:
string s = getStudentName()
cmd.CommandText = "SELECT * FROM students WHERE (name = '" + s + "')"
cmd.Execute()
ユーザーがこれを入力するとどうなりますか?
Robert'); DROP TABLE students; --
(答えは ここ )
代わりにこれを書いてください:
s = getStudentName()
cmd.CommandText = "SELECT * FROM students WHERE name = ?"
cmd.Parameters.Add(s)
cmd.Execute()
次に、ライブラリは入力をsanitizeし、これを生成します:
"SELECT * FROM students where name = 'Robert''); DROP TABLE students; --'"
すべてのDBMSが?
。 MS SQLはnamedパラメーターを使用しますが、これはhugeの改善と考えます:
cmd.Text = "SELECT thingA FROM tableA WHERE thingB = @varname"
cmd.Parameters.AddWithValue("@varname", 7)
result = cmd.Execute()
?
は名前のないパラメーターであり、クエリを実行するプログラムで入力して、 SQLインジェクション を回避できます。
?
はParameterized Queryを許可します。これらのパラメータ化されたクエリは、?
とそれぞれの値。
それだけです。
これが reason パラメーター化クエリを使用する方が良い理由です。基本的に、読みやすくデバッグしやすいです。
これはパラメーターです。クエリの実行時に指定できます。
これはSQLでは意味がないと思います。 JDBCのプリペアドステートメントなどを見ているかもしれません。その場合、疑問符はステートメントへのパラメーターのプレースホルダーです。
通常、クライアントによって提供されるパラメーターを表します。