web-dev-qa-db-ja.com

SQLクエリで疑問符は何を表しますか?

いくつかのSQLブックを調べているうちに、例では疑問符(?)クエリで。それは何を表していますか?

42
pradeep

表示されているのは、パラメータ化されたクエリです。これらは、プログラムから動的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()
76
egrunin

?は名前のないパラメーターであり、クエリを実行するプログラムで入力して、 SQLインジェクション を回避できます。

12
SLaks

?Parameterized Queryを許可します。これらのパラメータ化されたクエリは、?とそれぞれの値。

それだけです。

これが reason パラメーター化クエリを使用する方が良い理由です。基本的に、読みやすくデバッグしやすいです。

5
Buhake Sindi

これはパラメーターです。クエリの実行時に指定できます。

2
amorfis

これはSQLでは意味がないと思います。 JDBCのプリペアドステートメントなどを見ているかもしれません。その場合、疑問符はステートメントへのパラメーターのプレースホルダーです。

2
vicatcu

通常、クライアントによって提供されるパラメーターを表します。

1
Jens Schauder