Java 如果密码具有特殊字符,则无法使用JDBC连接到oracle数据库

Java 如果密码具有特殊字符,则无法使用JDBC连接到oracle数据库,java,oracle,jdbc,Java,Oracle,Jdbc,我正在尝试使用JDBC连接到oracle数据库 代码如下: public class OraclePwdTest { static{ try { Class.forName("oracle.jdbc.OracleDriver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static void m

我正在尝试使用JDBC连接到oracle数据库

代码如下:

public class OraclePwdTest {
static{
    try {           
        Class.forName("oracle.jdbc.OracleDriver");

    } catch (ClassNotFoundException e) {            
        e.printStackTrace();
    }
}
public static void main(String[] args) {
    // TODO Auto-generated method stub
    String ip ="192.168.20.145";
    String sid = "oradg";
    int port = 1521;
    String user = "sys";
    String pwd = "s@novi123";
    Connection conn = null;
    String url = "jdbc:oracle:thin:"+"(DESCRIPTION =" + 
            "(ADDRESS_LIST =" + 
            "(ADDRESS = (PROTOCOL = TCP)(HOST = "+ ip +")" +  
            "(PORT = " + port + "))" +  
                ")" + 
            "(CONNECT_DATA = (SRVR=DEDICATED) " + 
            "(SID = " + sid + 
            "))" + 
            ")"; 
    java.util.Properties prop = new java.util.Properties ();

    prop.put ("user", user); 
    prop.put ("password", pwd);
    prop.put ("internal_logon", "sysdba");
    try {
        conn = DriverManager.getConnection(url,prop);

        System.out.println("Connected");
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}

如果密码有特殊字符,如#@…则上述代码不起作用。它使用普通密码

我收到以下错误消息::

java.sql.SQLException:ORA-01017:用户名/密码无效;拒绝登录

    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:440)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:389)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:382)
    at oracle.jdbc.driver.T4CTTIfun.processError(T4CTTIfun.java:573)
    at oracle.jdbc.driver.T4CTTIoauthenticate.processError(T4CTTIoauthenticate.java:431)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:445)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:191)
    at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:366)
    at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:752)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:366)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:536)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:228)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:521)
    at java.sql.DriverManager.getConnection(DriverManager.java:582)
    at java.sql.DriverManager.getConnection(DriverManager.java:154)
    at TestOracleConnection.main(TestOracleConnection.java:54)
位于oracle.jdbc.driver.t4cttiore.processError(t4cttiore.java:440)
位于oracle.jdbc.driver.t4cttiore.processError(t4cttiore.java:389)
位于oracle.jdbc.driver.t4cttiore.processError(t4cttiore.java:382)
位于oracle.jdbc.driver.T4CTTIfun.processError(T4CTTIfun.java:573)
位于oracle.jdbc.driver.T4CTTIoauthenticate.processError(T4CTTIoauthenticate.java:431)
位于oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:445)
位于oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:191)
位于oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:366)
位于oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:752)
位于oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:366)
位于oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:536)
位于oracle.jdbc.driver.T4CConnection(T4CConnection.java:228)
位于oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
位于oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:521)
位于java.sql.DriverManager.getConnection(DriverManager.java:582)
位于java.sql.DriverManager.getConnection(DriverManager.java:154)
位于TestOracleConnection.main(TestOracleConnection.java:54)

请帮我解决这个问题。

一个简单的代码如下所示。。。当您使用瘦驱动程序时,您不需要将tnsnames.ora中的所有值复杂化

        Class.forName("oracle.jdbc.OracleDriver");
        Properties properties = new Properties();
        properties.setProperty("user", username);
        properties.setProperty("password", password);
        Connection con = DriverManager.getConnection("jdbc:oracle:thin:@<DB_HOST>:<PORT>:<SID>, properties);
Class.forName(“oracle.jdbc.OracleDriver”);
属性=新属性();
setProperty(“用户”,用户名);
设置属性(“密码”,密码);
Connection con=DriverManager.getConnection(“jdbc:oracle:thin:@:,properties”);

例如,jdbc:oracle:thin:@192.168.20.145:1521:oradg

当用户名、密码或连接字符串中有特殊字符,如
@
/
等时,我们必须将其包含在双引号中,例如,如果密码是
p@ssword
我们以
用户名/p@ssword“@数据库

您可以在java中使用转义字符将密码用双引号括起来,然后尝试更改密码

String pwd = "s@novi123";


我不是java专家,只是猜测scape字符应该是
\
;-)

当您使用
sqlplus
使用特殊字符进行连接时,它能工作吗?只是一个旁注:为什么您要从应用程序代码中以SYSDBA的身份进行连接。这听起来是个糟糕的主意。不..使用sqlplus也不能工作..如果它不能工作k on dos命令和sqlplus命令user/password@SID那么用户/密码组合本身就是错误的……请尝试使用有效的用户/密码。如果在SQL*Plus中不起作用,那么显然您的密码是错误的。@Jay:没有“DOS”“现在…用户名/密码组合本身似乎是错误的,因为它甚至在sqlplus上都不起作用。请尝试使用其他有效的用户/密码。
String pwd = "\"s@novi123\"";