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

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

你所看到的是一个参数化的查询 。 从程序执行dynamicSQL时,经常使用它们。

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

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

这有很多好处,可能很明显。 其中最重要的一点是:parsing你的参数的库函数是聪明的,并确保string被正确地转义。 例如,如果你写这个:

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

当用户input时会发生什么?

 Robert'); DROP TABLE students; -- 

(答案在这里 )

写这个,而不是:

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

然后,图书馆将消毒input,产生这样的:

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

这个? 是一个未命名的参数,可以通过运行查询的程序来填写,以避免SQL注入 。

这个? 是允许参数化查询 。 这些参数化的查询是允许在replacetypes特定的值时使用? 与他们各自的价值。

这就是它。

这是使用参数化查询更好的原因 。 基本上,读取和debugging更容易。

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

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

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