Reputation: 263
I'm trying to query a simple table using sqlx where the field in the WHERE clause is defined in MySQL as a VARBINARY(16). The table is defined as:
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 | |
+------------+-----------------+------+-----+---------+-------+
Given an input string from an end user for a "machine id", typically with the mysql command line client I will do this:
mysql> SELECT * from machine_state where machine_id = UNHEX('b25c07f2d2904704b7921173915c62ea');
+------------------------------------+------------+---------------------------------
---+
| id | data | machine_id
|
+------------------------------------+------------+---------------------------------
---+
| 0x00002422C9CF4D8BB8D44941D4DE66B7 | 0x0100 | 0xB25C07F2D2904704B7921173915C62EA |
+------------------------------------+------------+---------------------------------
1 row in set (0.00 sec)
That works as expected, however, I can't seem to accomplish the same thing with sqlx against the very same database table. I've tried using UNHEX, binding Vec[u8] as bind variables, a few other things as shown below. No errors, but the record is never returned.
// 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)
I wonder if anyone has any suggestions about the proper format to use when a VARBINARY(16) column is part of the WHERE clause? I feel like I'm missing something obvious but I can't seem to dig up any examples on this.
Upvotes: 0
Views: 1841
Reputation: 1245
This work?
let query_result = sqlx::query::<_>("SELECT * from machine_state where machine_id = UNHEX('b25c07f2d2904704b7921173915c62ea')")
.fetch_optional(database_connection_pool).await;
Upvotes: 1