1 问题
我们连接 mysql 数据库时,会使用 url 字符串创建连接,但是如果 url 中密码含有特殊字符,例如 @
或者 #
,则需要转义处理。
版本信息:
rustc 编译器版本:1.72.1
cargo 版本:1.71.2
rust 更新很快,请注意本文发布的时间:2023-08-21
2 解决方案
可以使用 percent-encoding
库。本文使用 2.3.0 版本
添加依赖:
[dependencies]
mysql = "*"
percent-encoding = "2.3.0"
编写代码:
use mysql::*;
use mysql::prelude::*;
use percent_encoding::{utf8_percent_encode, DEFAULT_ENCODE_SET, define_encode_set};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let password = "1234@@@@233323";
// 在这里定义需要转义的字符,例如 @ ! # 等
const FRAGMENT: &AsciiSet = &CONTROLS.add(b' ').add(b'@').add(b'!').add(b'"').add(b'<').add(b'>').add(b'`').add(b'#').add(b'?').add(b'{').add(b'}').add(b'|').add(b'\\').add(b'^').add(b'~').add(b'[').add(b']').add(b'`').add(b'/').add(b'@').add(b'$').add(b'&').add(b'+').add(b',').add(b';').add(b'=').add(b':');
let encoded_password = utf8_percent_encode(password, FRAGMENT);
let url: String = format!(
"mysql://root:{encoded_password}@mysql_database.example.com/database_name"
);
println!("url: {}", url);
// 新建连接池
let pool = Pool::new(url.as_str())?;
let mut conn = pool.get_conn()?;
println!("done");
Ok(())
}