我有一个带有二进制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
字段可以是任意长度。
1条答案
按热度按时间oalqel3c1#
而不是
Binary
数据类型,您应该使用Varbinary
. 如果数据长度小于定义的最大大小,则不会用尾随0填充数据。当二进制值被存储时,它们被pad值右填充到指定的长度。pad值是0x00(零字节)。值在insert时用0x00右填充,在select时不删除任何尾随字节。
对于varbinary,insert上没有填充,select上没有剥离字节。
另外,您不需要在已经定义的主键上定义唯一约束。主键基本满足唯一约束,附加条件为
NOT NULL
价值观。因此,进一步定义唯一约束并不会增加任何内容。这就是
CREATE TABLE
语句可以是:查询#1
查询#2
db fiddle视图