2015-06-15 66 views
0

我需要一个16字节的二进制数据列是唯一的。为什么在MySQL和MariaDB中,当BLOB(16)支持唯一的VARCHAR时,它们是不是唯一的?这是支持的,但不是一个固定长度的字节集合似乎是坚果。此外,通过以base64编码的字符串存储二进制值来浪费空间是不可接受的。因此,比转换为/创建组合唯一索引的两个BIGINT更好的选择(如果它很重要,这个16字节的二进制不会被用作主键)? (另外,如果我确实使用了两个BIGINT,那么INSERT IGNORE在复合唯一索引上的重复插入会如同非复合索引那样静静地失败吗?这对于我来说非常重要,因为我需要重复的16字节插入的情况下尝试无提示失败加上后续LAST_INSERT_ID()返回0)。MySQL/MariaDB固定长度的唯一BLOB

+1

你试过二进制或varbinary吗? – Tim3880

+0

工作台不让我将BINARY设置为Unique。 –

回答

2

您可以在BLOB列上创建UNIQUE索引,只需指定索引的最大长度(这也意味着,它将只在那些许多角色中才是唯一的)。

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

例如,在23年6月5日测试:

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) 
+0

这工作;谢谢! –

1

BINARY(16)是你的意思有。