mysql二进制查询

xu3bshqb  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(432)

我有一个带有二进制pk的表:

CREATE TABLE `codes` (
   `Code` binary(45) NOT NULL,

   PRIMARY KEY (`Code`),
   UNIQUE KEY `Code_UNIQUE` (`Code`)

 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入时使用 BINARY('value') .
我试图检索一行 Code 使用以下方法:

SELECT * from codes WHERE `Code` = BINARY('value')

这不起作用,因为 Code 字段是45,所以mysql用空字节填充数据。
这可以通过运行以下命令来可视化:

SELECT HEX(Code), HEX(BINARY('value')) FROM codes


我可以让它处理这个(丑陋的)查询:

SELECT * FROM codes WHERE TRIM('0' from HEX(Code)) = HEX(BINARY('value'))

所以我只是想知道是否有人能提供一个好的和性能的方法来实现这一点。如果您知道数据的大小,这是很简单的,但是 Code 字段可以是任意长度。

oalqel3c

oalqel3c1#

而不是 Binary 数据类型,您应该使用 Varbinary . 如果数据长度小于定义的最大大小,则不会用尾随0填充数据。
当二进制值被存储时,它们被pad值右填充到指定的长度。pad值是0x00(零字节)。值在insert时用0x00右填充,在select时不删除任何尾随字节。
对于varbinary,insert上没有填充,select上没有剥离字节。
另外,您不需要在已经定义的主键上定义唯一约束。主键基本满足唯一约束,附加条件为 NOT NULL 价值观。因此,进一步定义唯一约束并不会增加任何内容。
这就是 CREATE TABLE 语句可以是:

CREATE TABLE `codes` (
   `Code` Varbinary(45) NOT NULL, -- Changed to Varbinary

   PRIMARY KEY (`Code`) -- Removed Unique constraint

 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into codes (Code) VALUES (BINARY('value'));

查询#1

SELECT HEX(Code), HEX(BINARY('value')) FROM codes ;

| HEX(Code)  | HEX(BINARY('value')) |
| ---------- | -------------------- |
| 76616C7565 | 76616C7565           |

查询#2

SELECT * from codes WHERE `Code` = BINARY('value');

| Code            |
| --------------- |
| [object Object] |

db fiddle视图

相关问题