JDBC MySQL URL和特殊字符的问题

时间:2017-04-23 15:39:31

标签: java mysql url jdbc escaping

我目前在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服务器测试)

1 个答案:

答案 0 :(得分:3)

JDBC网址不一定遵循' normal'互联网网址。但是,查看MySQL Connector / J NonRegisteringDriver.parseURL中的代码,它将java.net.URLDecoder应用于键和值,因此我实际上希望这可以工作;不知道发生了什么事。

如果特定问题是使用用户名和密码,那么解决方案是不将它们包含在URL中,而是使用以下之一:

如果由于您使用的API而无法调用这些内容,则可能需要与图书馆作者联系,以了解可以采取哪些措施来解决此问题。

最后还有一个实用的解决方案:不要在密码中使用冒号。

作为旁注:在这里没有必要像你一样使用StringBuilder;如果您使用纯字符串连接,Java编译器将为您优化。