在 PostgreSQL 中出现“trailing junk after parameter at or near”错误的原因和解决方法是什么?
首先
这是我初次投稿。
我是今年入职的一年级新人工程师,如果发现任何错别字、内容错误等问题,请随便指出。
虽然这篇稿件只是我的学习备忘录,但如果能对遇到同样问题的人提供帮助,我将不胜感激。
Java和PostgreSQL
这次我使用Java的JSP和Servlet机制进行了简单的Web应用程序开发。数据库系统使用了PostgreSQL。
发生的错误
在使用servlet访问数据库时,通常会使用DAO模式。以下是本次使用的DAO模式的方法。
我是初学者,对于代码的编写方式等方面,请不要过于苛刻的指责。。(当然,改进建议是欢迎的)
public class LoginDAO {
protected static Connection conn;
// データベースとの接続情報
public LoginDAO (Connection conn) {
LoginDAO.conn = conn;
}
// テーブル名
private static final String TABLE_NAME = " user_table ";
// ログイン認証に使用するためにユーザー固有のIDとパスワードを取得するメソッド
// 一致しない場合は空のデータが返る
public UserDTO findUsers(String user_id, String password) throws IllegalArgumentException, InvocationTargetException,
NoSuchMethodException, SecurityException, SQLException, NamingException {
UserDTO userRs = new UserDTO();
String sql = "SELECT" + " user_id," + "user_name FROM" + TABLE_NAME +
"WHERE user_id = ?" + "AND password = ?";
ResultSet rs = null;
try (PreparedStatement statement = conn.prepareStatement(sql.toString())) {
statement.setString(1, user_id);
statement.setString(2, password);
rs = statement.executeQuery();
while(rs.next()) {
userRs.setUserId(rs.getString("user_id"));
userRs.setUserName(rs.getString("user_name"));
}
return userRs;
} catch (SQLException e) {
throw sqlErr(e, sql);
}
}
}
假设按照以下方式执行这个操作。(为了更易理解,以下仅列出了部分处理步骤,实际上还会有其他一些处理步骤)
String user_id = (String) request.getParameter("loginId");
String password = (String) request.getParameter("loginPassword");
// user_idには"test1"という値を入れました
// passwordには"pass"という値を入れました
findUsers(user_id,password);
所以出现了以下错误消息。
由于:org.postgresql.util.PSQLException引起的错误:错误:在”$1A”附近或之后有多余的参数。
也许,使用PostgreSQL版本”15以后”的用户可能已经注意到了。
暂且从搜索结果的最上方开始阅读。我读了《PostgreSQL 15 Press Kit》,但对于完全的业余者来说,内容太专业了,我不理解。
接下来我阅读了以下内容。
关于PostgreSQL 15的技术信息。
在这里,有几个引起我的兴趣的词句。
数值字面量后不允许出现非数值字符。在过去,“123abc”这样的字符串会解析成两个标记,即“123”和紧随其后的“abc”。
嗯嗯,
还有这样写道。
JSON的数字文字处理已根据SQL/JSON标准进行了修改。(彼得·艾森特劳特) (15)
将接受像”.1″或”1.”这样的数字格式。而像”1.type()”这样在数字文字后跟着方法的写法将被禁止。
我纠结着,不知道这是否相关。
解决方法 → 解决的途径或办法
我根据以下页面进行了参考,并对以下部分进行了更改:PostgreSQL 15-语法敏感度。
-String sql = "SELECT" + " user_id," + "user_name FROM" + TABLE_NAME +
- "WHERE user_id = ?" + "AND password = ?";
+String sql = "SELECT" + " user_id," + "user_name FROM" + TABLE_NAME +
+ "WHERE user_id = ? " + "AND password = ?";
用户ID是?
这次的问题似乎是因为在测试数据中给user_id赋了”value1″这样的值。
似乎是在数字后面跟着字母会导致故障的原因。
虽然不清楚具体原因,但是对于这次的故障,现在以上述方式应该是可以解决的。
如果PostgreSQL的版本是“14”,似乎即使没有空格也可以运行,但是在版本15及更高版本中,我们最好注意一下这方面。
最后
如果能够对遇到和我一样错误的人们提供参考,我会感到幸运。
此外,当出现错误时,耐心地进行调查,意想不到的发现可能会出现在意想不到的地方。
我在第一次发布文章后感到非常疲惫。
这次就到这里吧。下次我会努力写出有价值的文章。