我目前在JDBC MySQL连接的URL中遇到了像:
这样的特殊字符的问题。因为它是一个URL我认为我可以只对我提供的字符串进行URL编码(就像密码一样)。但它没有用。
我尝试了以下代码
public class DatabaseConnection {
protected static String urlEncode(String toEncode) {
try {
return URLEncoder.encode(toEncode, "UTF-8");
} catch (UnsupportedEncodingException e) {
// Won't happen anyways!
e.printStackTrace();
return null;
}
}
public DatabaseConnection(String host, int port, String database, String user, String password)
throws SQLException {
StringBuilder connectionURL = new StringBuilder();
connectionURL.append("jdbc:mysql://").append(urlEncode(host)).append(':').append(port).append('/')
.append(urlEncode(database)).append("?user=").append(urlEncode(user)).append("&password=")
.append(urlEncode(password));
connect(connectionURL);
}
}
(连接方法运行良好。它取决于我使用的库,因此提供代码不会做太多。)
只要密码(或任何其他字符串)不包含:
,代码就可以正常运行。可能是其他字符也不起作用,但我还没有测试过。 :
被转义为%3A
。然后登录失败。我多次验证密码是否正确。 (通过命令行连接MySQL服务器测试)
答案 0 :(得分:3)
JDBC网址不一定遵循' normal'互联网网址。但是,查看MySQL Connector / J NonRegisteringDriver.parseURL
中的代码,它将java.net.URLDecoder
应用于键和值,因此我实际上希望这可以工作;不知道发生了什么事。
如果特定问题是使用用户名和密码,那么解决方案是不将它们包含在URL中,而是使用以下之一:
javax.sql.DataSource
实施DriverManager.getConnection(String url, String user, String password)
DriverManager.getConnection(String url, Properties info)
并在user
对象中将用户名和密码作为属性password
和Properties
传递(您可以对其他属性执行相同操作)如果由于您使用的API而无法调用这些内容,则可能需要与图书馆作者联系,以了解可以采取哪些措施来解决此问题。
最后还有一个实用的解决方案:不要在密码中使用冒号。
作为旁注:在这里没有必要像你一样使用StringBuilder
;如果您使用纯字符串连接,Java编译器将为您优化。