Java 通过jdbc更改用户密码。包含问号的通行证的问题

Java 通过jdbc更改用户密码。包含问号的通行证的问题,java,sql,oracle,jdbc,Java,Sql,Oracle,Jdbc,当密码包含问号字符时,我在修改用户密码时遇到问题。到目前为止,我没有遇到任何其他字符的这个问题,它似乎是特定于问号字符的 如果我使用以下sql更改sqlplus中的用户密码: 将“新密码”标识的用户替换为“旧密码”; 然后它成功地更改了密码,我可以使用新密码“NewPassword”登录 但是,如果我通过jdbc执行相同的SQL: final String query=“ALTER user Stephen identified by\“NewPassword”\“REPLACE\“Old

当密码包含问号字符时,我在修改用户密码时遇到问题。到目前为止,我没有遇到任何其他字符的这个问题,它似乎是特定于问号字符的

如果我使用以下sql更改sqlplus中的用户密码:

将“新密码”标识的用户替换为“旧密码”;

然后它成功地更改了密码,我可以使用新密码“NewPassword”登录

但是,如果我通过jdbc执行相同的SQL:

final String query=“ALTER user Stephen identified by\“NewPassword”\“REPLACE\“OldPassword\”
stmt.executeUpdate(查询);

然后,我无法使用密码“NewPassword”登录

当通过sqlplus和jdbc输入密码时,检查hashcode可以看出它们是不同的。 不知何故,当我在jdbc中运行语句时,它输入的不是“NewPassword”

我似乎对以下密码没有任何问题: 新密码,新密码\,新密码'。似乎正是这个问号造成了问题。
调试显示问号的代码点(dec)为63,因此看起来不会中途更改

有人知道是什么导致了这种行为吗?
我现在不知所措,我正在考虑阻止带问号的传球,以暂时绕过这个问题。

尝试使用
PreparedStatement
实现它,看看你是否遇到同样的问题。问号在
PreparedStatements
中用作占位符,因此JDBC驱动程序可能会感到困惑。不应该,但可能值得检查

PreparedStatement p = conn.prepareStatement("ALTER user Stephen identified by ? replace ?");
p.setString(1, "NewPassword?");
p.setString(2, "OldPassword");
p.execute();

如果这样做有效,那么很可能是驱动程序中的错误。

要使用JDBC更改Oracle用户的密码,您需要做两件事:

  • 将密码直接放入SQL字符串中(不能使用绑定参数)
  • 禁用转义处理
不能使用绑定变量,因为用户名和密码不会作为单引号字符串发送到数据库

SQL字符串中的
被视为绑定变量占位符,因此Oracle JDBC会在某个时候损坏SQL字符串。对语句禁用转义处理将阻止这种情况发生。尝试:

Statement s = conn.createStatement();
s.setEscapeProcessing(false);
s.executeUpdate("ALTER user Stephen identified by \"newPassword?\" replace \"oldPassword\"");

如果以编程方式设置密码,代码还应确保新密码和旧密码不包含任何
字符,以避免SQL注入。

哪个DB版本?哪个JDBC驱动程序版本?什么是
stmt.getClass().getName()
say?很抱歉,我一开始就应该提到这一点。db version=Oracle Database 10g Express Edition 10.2.0.1.0版-生产版,驱动程序版本=10.2.0.4.0,stmt.getClass().getName()=oracle\u jdbc\u driver\u T4CStatement\u proxy您不能将占位符与y标识的
ALTER USER x一起使用,至少不能与oracle一起使用。用户名和密码不会作为单引号字符串发送到数据库。啊。这可能不会起作用。不过,问号被误解的想法可能仍然是正确的。谢谢Pourquoi。这听起来确实像它正在做的事情。我将尝试一下您的解决方案:)From:“注意:由于准备好的语句通常在进行此调用之前已被解析,因此禁用PreparedStatements对象的转义处理将不会有任何效果“@VitoShadow:谢谢你的评论。我已经更新了我的答案,使用了一个简单的
语句
,因为这似乎就是提问者正在使用的。顺便说一句,我不能再重现询问者的问题了——也许它已经在比我当时使用的更高版本的Oracle JDBC驱动程序中修复了。