我尝试使用sqlx查询一个简单的表,其中WHERE子句中的字段在MySQL中定义为VARBINARY(16)。
mysql> desc machine_state;
+------------+-----------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+-----------------+------+-----+---------+-------+
| id | binary(16) | NO | PRI | NULL | |
| data | varbinary(2048) | YES | | NULL | |
| machine_id | varbinary(16) | NO | | NULL | |
+------------+-----------------+------+-----+---------+-------+
给定一个来自终端用户的输入字符串作为“机器ID”,通常使用MySQL命令行客户端,我将这样做:
mysql> SELECT * from machine_state where machine_id = UNHEX('b25c07f2d2904704b7921173915c62ea');
+------------------------------------+------------+---------------------------------
---+
| id | data | machine_id
|
+------------------------------------+------------+---------------------------------
---+
| 0x00002422C9CF4D8BB8D44941D4DE66B7 | 0x0100 | 0xB25C07F2D2904704B7921173915C62EA |
+------------------------------------+------------+---------------------------------
1 row in set (0.00 sec)
这和预期的一样,但是,我似乎不能用sqlx对同一个数据库表完成同样的事情。我试过使用UNHEX,绑定Vec[u8]作为绑定变量,还有一些其他的事情,如下所示。没有错误,但是记录永远不会返回。
// Input variable I am looking for in a binary column
let machine_id = "b25c07f2d2904704b7921173915c62ea";
// Try using UNHEX with a bind variable
let query_result = sqlx::query::<_>("SELECT * from machine_state where machine_id = UNHEX(?)")
.bind(machine_id)
.fetch_optional(database_connection_pool).await;
println!("{:?}", query_result);
// Try using UNHEX directly as in the command line
let query_result = sqlx::query::<_>("SELECT * from machine_state where machine_id.as_bytes = UNHEX('b25c07f2d2904704b7921173915c62ea')")
.fetch_optional(database_connection_pool).await;
println!("{:?}", query_result);
// Try binding a Vec<u8> representation of the string
let bytes: Vec<u8> = machine_id.as_bytes().to_vec();
let query_result = sqlx::query::<_>("SELECT * from machine_state where machine_id = ?")
.bind(bytes)
.fetch_optional(database_connection_pool).await;
println!("{:?}", query_result);
... OUTPUT ....
Ok(None)
Ok(None)
Ok(None)
我想知道,当VARBINARY(16)列是WHERE子句的一部分时,是否有人对使用正确的格式有任何建议?我觉得我错过了一些明显的东西,但我似乎无法挖掘出任何关于这方面的示例。
1条答案
按热度按时间r6hnlfcb1#
这个有用吗