我需要一个16字节的二进制数据列才是唯一的。当它支持唯一的VARCHAR时,为什么BLOB(16)在MySQL和MariaDB中是唯一的?这是支持但不是固定长度的字节集似乎是疯了。而且,通过在base64编码的字符串中存储二进制值来浪费空间是不可接受的。那么,除了转换成两个产生复合唯一索引的BIGINT之外,还有哪个更好的选择(这个16字节的二进制文件不用作主键,如果重要的话)?
(另外,如果我确实使用了两个BIGINT,那么INSERT IGNORE是否会在复合唯一索引上的重复插入时静默失败,就像非复合索引一样?这在我的情况下是至关重要的,因为我需要这样的情况重复的16字节插入尝试静默失败以及从后续LAST_INSERT_ID()返回0。)
答案 0 :(得分:2)
你可以在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)
答案 1 :(得分:1)
BINARY(16)
就是你的意思。