Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
问号在SQL查询中代表什么?_Sql_Prepared Statement - Fatal编程技术网

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

问号在SQL查询中代表什么?,sql,prepared-statement,Sql,Prepared Statement,在阅读一些SQL书籍时,我发现示例在查询中倾向于使用问号(?)。它代表什么?该?是一个未命名的参数,可由运行查询的程序填写以避免。它通常代表由客户端提供的参数 这是一个参数。您可以在执行查询时指定它。我认为这在SQL中没有任何意义。您可能正在查看JDBC或其他语言中准备好的语句。在这种情况下,问号是语句参数的占位符。该?允许参数化查询。这些参数化查询允许在用各自的值替换?时使用特定于类型的值 就这些 下面是使用参数化查询更好的原因。基本上,它更易于阅读和调试。您看到的是一个参数化查询。在从程序执

在阅读一些SQL书籍时,我发现示例在查询中倾向于使用问号(
)。它代表什么?

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

它通常代表由客户端提供的参数

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

我认为这在SQL中没有任何意义。您可能正在查看JDBC或其他语言中准备好的语句。在这种情况下,问号是语句参数的占位符。

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

就这些


下面是使用参数化查询更好的原因。基本上,它更易于阅读和调试。

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

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

你这样写:

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()
这有许多好处,这可能是显而易见的。最重要的一点是:解析参数的库函数非常聪明,可以确保字符串正确转义。例如,如果您编写以下内容:

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; --
(答案是)

写下以下内容:

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

你能提供查询的代码吗?我想这是准备好的语句中的变量,但是你应该发布特定的查询来确定。你能提供一个例子吗?