MySQL / MariaDB 固定长度的唯一 BLOB

MySQL / MariaDB unique BLOB of fixed length

我需要一个 16 字节的二进制数据列是唯一的。为什么 BLOB(16) 在 MySQL 和 MariaDB 中不能是唯一的,当它支持唯一的 VARCHAR 时?这是受支持的,但不是固定长度的字节集,这似乎很疯狂。此外,通过将二进制值存储在 base64 编码字符串中来浪费 space 是不可接受的。因此,有什么比转换 to/from 两个构成复合唯一索引的 BIGINT 更好的选择(如果重要,这个 16 字节的二进制文件不用作主键)?

(此外,如果我确实使用两个 BIGINT,INSERT IGNORE 是否会像在非复合唯一索引上那样在复合唯一索引上重复插入时静默失败?这对我来说很重要,因为我需要重复 16 字节插入的情况尝试静默失败加上来自后续 LAST_INSERT_ID() 的 0 的 return。)

您可以在 BLOB 列上创建 UNIQUE 索引,您只需指定索引的最大长度(这也意味着,它只能在这么多字符内唯一)。

但是,请考虑改用 VARBINARY,它允许您固定长度并意味着您不能插入可能意外破坏唯一约束的较长字段。参见 https://dev.mysql.com/doc/refman/5.6/en/binary-varbinary.html

示例,在 5.6.23 上测试:

mysql [localhost] {msandbox} (test) > create table t1 (a BLOB(16), UNIQUE INDEX `a`(`a`(16)));
Query OK, 0 rows affected (0.01 sec)

mysql [localhost] {msandbox} (test) > insert into t1 values('aaa');
Query OK, 1 row affected (0.01 sec)

mysql [localhost] {msandbox} (test) > insert into t1 values('aaa');
ERROR 1062 (23000): Duplicate entry 'aaa' for key 'a'
mysql [localhost] {msandbox} (test) > 

mysql [localhost] {msandbox} (test) > create table t2(a VARBINARY(16), UNIQUE INDEX `a`(`a`));
Query OK, 0 rows affected (0.02 sec)

BINARY(16) 是你想要的。