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

43 sql prepared-statement

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

egr*_*nin 77

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

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

ODBCCommand cmd = new ODBCCommand("SELECT thingA FROM tableA WHERE thingB = 7")
result = cmd.Execute()
Run Code Online (Sandbox Code Playgroud)

你写这个:

ODBCCommand cmd = new ODBCCommand("SELECT thingA FROM tableA WHERE thingB = ?")
cmd.Parameters.Add(7)
result = cmd.Execute()
Run Code Online (Sandbox Code Playgroud)

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

string s = getStudentName()
cmd.CommandText = "SELECT * FROM students WHERE (name = '" + s + "')"
cmd.Execute()
Run Code Online (Sandbox Code Playgroud)

当用户输入时会发生什么?

Robert'); DROP TABLE students; --
Run Code Online (Sandbox Code Playgroud)

(答案在这里)

写这个:

s = getStudentName()
cmd.CommandText = "SELECT * FROM students WHERE name = ?"
cmd.Parameters.Add(s)
cmd.Execute()
Run Code Online (Sandbox Code Playgroud)

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

"SELECT * FROM students where name = 'Robert''); DROP TABLE students; --'"
Run Code Online (Sandbox Code Playgroud)

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

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


SLa*_*aks 12

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


Buh*_*ndi 5

?是让参数化查询.这些参数化查询在?使用各自的值替换时允许特定于类型的值.

这就是它的全部.

这就是为什么使用参数化查询更好的原因.基本上,它更容易阅读和调试.