Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDBCMySQL URL和特殊字符的问题_Java_Mysql_Url_Jdbc_Escaping - Fatal编程技术网

Java JDBCMySQL URL和特殊字符的问题

Java JDBCMySQL URL和特殊字符的问题,java,mysql,url,jdbc,escaping,Java,Mysql,Url,Jdbc,Escaping,我目前遇到了一个问题,在JDBCMySQL连接的URL中有一些特殊字符,如:。因为它是一个URL,我想我可以对我提供的字符串进行URL编码(比如密码)。但是它不起作用 我尝试了以下代码 public class DatabaseConnection { protected static String urlEncode(String toEncode) { try { return URLEncoder.encode(toEncode, "UTF-

我目前遇到了一个问题,在JDBCMySQL连接的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);
    }
}
(connect方法工作得很好。它依赖于我使用的库,所以提供代码不会有多大作用。)


只要密码(或任何其他字符串)不包含
,代码就可以正常工作。可能其他字符也不起作用,但我还没有测试过。
被转义到
%3A
。然后登录失败。我多次验证密码是否正确。(通过命令行连接MySQL服务器进行测试)

JDBC URL不一定遵循“正常”internet URL的规则。然而,看看MySQL Connector/J中的代码,它将
java.net.urldecker
应用于键和值,因此我实际上希望它能够工作;不知道发生了什么事

如果用户名和密码存在特定问题,则解决方案是不将其包含在URL中,而是使用以下选项之一:

  • 使用正确属性配置的
    javax.sql.DataSource
    实现
  • 并在
    properties
    对象中将用户名和密码作为属性
    user
    password
    传递(您可以对其他属性执行相同的操作)
如果由于所使用的API而无法调用这些函数,则可能需要联系库作者,以了解如何修复它

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


作为旁注:这里不需要像您那样使用
StringBuilder
;如果您使用纯字符串连接,Java编译器将为您优化此操作。

遗憾的是,我获取数据源的唯一方法是使用此方法
DataSource getDataSource(string jdbcConnection)抛出SQLException
,之后您无法修改它。嗯,我想我必须在库中再深入挖掘一下。@brainsone你可以在中找到MySQL使用的解析方法,它实际上似乎使用了
urldecker
,所以我希望你的代码能够使用它。根据该方法的文档,预期的URL格式是
jdbc://[:]@/
。那我就试试看。另外,我也不确定我使用的库是使用MySQL连接器/J还是其他库。(使用)