Sqlite+;java,准备语句的奇怪行为

Sqlite+;java,准备语句的奇怪行为,java,sqlite,Java,Sqlite,使用java/sqlite时,我遇到了一个无法解释的问题: String sql = "Select date, type FROM line ORDER BY ?"; PreparedStatement st = DB.getConnexion().prepareStatement(sql); st.setString(1, sort); ResultSet rs = st.executeQuery(); 这段代码给了我错误的顺序(默认顺序)[相信我,我反复检

使用java/sqlite时,我遇到了一个无法解释的问题:

    String sql = "Select date, type FROM line ORDER BY ?";
    PreparedStatement st = DB.getConnexion().prepareStatement(sql);
    st.setString(1, sort);
    ResultSet rs = st.executeQuery();
这段代码给了我错误的顺序(默认顺序)[相信我,我反复检查参数是否正确]

    String sql = "Select date, type FROM line ORDER BY " + sort;
    PreparedStatement st = DB.getConnexion().prepareStatement(sql);
    //st.setString(1, sort);
    ResultSet rs = st.executeQuery();
这一个产生了预期的结果。我在这里有点不知所措,这对我来说毫无意义。 我尝试重新启动eeclipse,重建项目,直接从sqlite浏览器测试我的请求,在每个可能的地方检查参数和结果,但sqlite的setString()函数似乎没有正确地为我的参数指定属性,甚至没有崩溃或产生错误


我要么错过了一些非常愚蠢的东西,要么这里发生了一些非常错误的事情。

事实上,令人惊讶的是,SQL引擎接受了这种语法。它可能会在其他一些领域失败

无论如何,
排序
被解释为一个字符串常量,因此所有行对于排序算法都具有相同的值。因此,由于它们具有相同的值,因此它保持原始顺序


您不能使用这样的动态语句,唯一的方法是第二种解决方案,它将排序直接附加到语句字符串。

SQL引擎居然接受这种语法,这真是令人惊讶。它可能会在其他一些领域失败

无论如何,
排序
被解释为一个字符串常量,因此所有行对于排序算法都具有相同的值。因此,由于它们具有相同的值,因此它保持原始顺序


您不能使用这样的动态语句,唯一的方法是第二种解决方案,它将排序直接附加到语句字符串。

这是因为您告诉SQL参数是字符串。假设参数是Name。你的陈述是这样的:

Select date, type FROM line ORDER BY 'Name'
从技术上讲,这可能是有效的SQL,但它不会有效地对列进行排序——它不是按名称列排序,而是按“名称”进行排序,名称始终是相同的常量字符串


我不认为你可以使用参数。您必须更改语句本身以获得所需的排序列。当然,您希望确保在执行此操作时不允许出现注入漏洞,因此您可能不希望将变量中的任何内容都粘贴到语句中。您可能希望有一个白名单,其中包括表中可能的列,并拒绝不属于这些列的任何内容。

这是因为您告诉SQL参数是一个字符串。假设参数是Name。你的陈述是这样的:

Select date, type FROM line ORDER BY 'Name'
从技术上讲,这可能是有效的SQL,但它不会有效地对列进行排序——它不是按名称列排序,而是按“名称”进行排序,名称始终是相同的常量字符串


我不认为你可以使用参数。您必须更改语句本身以获得所需的排序列。当然,您希望确保在执行此操作时不允许出现注入漏洞,因此您可能不希望将变量中的任何内容都粘贴到语句中。您可能希望有一个包含表中可能列的白名单,并拒绝任何不属于这些列的内容。

可能重复的可能重复的可能重复的我太固执了,我没有意识到我没有处理数据,给我一个facepalm,谢谢你。我真希望它崩溃了,叫我白痴。我太固执了,竟然没有意识到我不是在处理数据,给我一个掌心,谢谢你。我希望它崩溃了,叫我白痴。也谢谢你,也谢谢你