我有一张带有二进制 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
字段可以是任意长度。
最佳答案
而不是 Binary
数据类型,你应该使用 Varbinary
.这不会用尾随 0 填充数据,以防数据长度小于定义的最大大小。
When BINARY values are stored, they are right-padded with the pad value to the specified length. The pad value is 0x00 (the zero byte). Values are right-padded with 0x00 on insert, and no trailing bytes are removed on select.
For VARBINARY, there is no padding on insert and no bytes are stripped on select.
此外,您不需要在已定义的主键上定义唯一约束。 Primary Key基本满足Unique约束,附加条件NOT NULL
值。因此,进一步定义 Unique 约束不会在其上添加任何内容。
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] |
关于MySql 二进制查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53246046/