使用PreparedStatement在where子句中传递字符串

时间:2019-05-07 13:22:54

标签: java mysql jdbc

如何使用PreparedStatementwhere子句中传递字符串?

我尝试了以下代码行:

String sql = "select pass from lbdb_user WHERE username = ? collate latin1_bin";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1,"\""+username+"\"" );

它引发以下mysql异常:

You have an error in your SQL syntax;

3 个答案:

答案 0 :(得分:3)

像这样尝试:

String username = "Mickey Mouse";
String sql = "select pass from lbdb_user WHERE username = ? ";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, username);

我不知道该整理什么。我建议您在数据库中使用Unicode和UTF-8。

答案 1 :(得分:0)

下面是一个使用COLLATE latin1_bin的示例,它与您发布的内容相同,并且可以正常工作

String lSql = "SELECT lastname FROM contacts WHERE lastname= ? COLLATE latin1_bin ";
PreparedStatement lPreparedStatement = con.prepareStatement(lSql);
lPreparedStatement.setString(1, "andre");
ResultSet lResultSet = lPreparedStatement.executeQuery();

答案 2 :(得分:-2)

您是否正在使用Microsoft Transact-SQL?我只是无法测试,但尝试在“ order by”之后使用升序,并以asc结尾。由于归类确定特殊的排序顺序,因此如果不排序,则无法归类。

第二,我认为不存在带有引号的用户名。 您只能将它们包围在SQL中,而如果调用已准备好的语句的“ setString”方法,则不会。

更正的代码:

String sql = "select pass from lbdb_user WHERE username = ? order by pass collate latin1_bin asc";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, username);