当VARBINARY(16)列是where子句的一部分时,使用RUST sqlx返回MySQL中的行

g6baxovj  于 2022-12-23  发布在  Mysql
关注(0)|答案(1)|浏览(209)

我尝试使用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子句的一部分时,是否有人对使用正确的格式有任何建议?我觉得我错过了一些明显的东西,但我似乎无法挖掘出任何关于这方面的示例。

r6hnlfcb

r6hnlfcb1#

这个有用吗

let query_result = sqlx::query::<_>("SELECT * from machine_state where machine_id = UNHEX('b25c07f2d2904704b7921173915c62ea')")
    .fetch_optional(database_connection_pool).await;

相关问题