在設定 Oracle 使用者密碼時,若不小心包含了 @ 符號,嘗試以一般方式登入(如 SQL*Plus、exp/imp 工具或應用程式連線字串)往往會失敗,並拋出「無法解析的連接字串」或類似的 TNS 解析錯誤。這是因為 @ 在 Oracle 連線語法中被視為主機識別碼的分隔符(例如 user/pass@host:port/sid),導致解析器誤判密碼結束位置。
解決方法非常簡單:將完整密碼用雙引號括起來,並在命令列或腳本中對雙引號進行適當的轉義。具體做法視作業系統與工具而異,常見範例如下:
conn system/"xxx@yyy"@localhost:1521/orcl
說明:在 Windows cmd 中雙引號通常不需額外轉義;在 Linux/Unix shell 中若在雙引號字串內,需寫成 \"xxx@yyy\"。
expdp system/"xxx@yyy"@localhost:1521/orcl ...
jdbc:oracle:thin:system/"xxx@yyy"@//localhost:1521/orcl
或在連線屬性中單獨設定密碼屬性(推薦,避免字串解析問題):
Properties props = new Properties();
props.setProperty("user", "system");
props.setProperty("password", "xxx@yyy"); // 此處無需雙引號
Connection conn = DriverManager.getConnection(url, props);
若使用 TNS 別名,建議在 tnsnames.ora 中定義好服務名,連線時僅指定 system/"xxx@yyy"@my_tns_alias,避免在命令列暴露完整連線描述符。
shlex.quote() 或參數化方式),切勿手工拼接。掌握此技巧,即可輕鬆應對含特殊字元密碼的 Oracle 連線場景,避免不必要的排查時間。