问号在SQL查询中表示什么?

时间:2010-09-16 14:31:47

标签: sql prepared-statement

在浏览一些SQL书籍时,我发现示例往往在查询中使用问号(?)。它代表什么?

6 个答案:

答案 0 :(得分:72)

您看到的是参数化查询。从程序执行动态SQL时经常使用它们。

例如,而不是写这个( note:伪代码):

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()

这有许多优点,可能很明显。其中最重要的一个:解析参数的库函数很聪明,并确保正确转义字符串。例如,如果你这样写:

string s = getStudentName()
cmd.CommandText = "SELECT * FROM students WHERE (name = '" + s + "')"
cmd.Execute()

用户输入后会发生什么?

Robert'); DROP TABLE students; --

(答案为here

改为写下:

s = getStudentName()
cmd.CommandText = "SELECT * FROM students WHERE name = ?"
cmd.Parameters.Add(s)
cmd.Execute()

然后库将清理输入,产生:

"SELECT * FROM students where name = 'Robert''); DROP TABLE students; --'"

并非所有DBMS都使用?。 MS SQL使用命名的参数,我认为这是巨大的改进:

cmd.Text = "SELECT thingA FROM tableA WHERE thingB = @varname"
cmd.Parameters.AddWithValue("@varname", 7)
result = cmd.Execute()

答案 1 :(得分:12)

?是一个未命名的参数,可以由运行查询的程序填写,以避免SQL injection

答案 2 :(得分:5)

?是允许参数化查询。这些参数化查询在将?替换为各自的值时允许特定于类型的值。

这就是它的全部。

这是reason为什么最好使用参数化查询。基本上,它更容易阅读和调试。

答案 3 :(得分:2)

这是一个参数。您可以在执行查询时指定它。

答案 4 :(得分:2)

我认为SQL中没有任何意义。您可能正在查看JDBC中的Prepared Statements或其他内容。在这种情况下,问号是声明参数的占位符。

答案 5 :(得分:1)

它通常表示客户端提供的参数。