2015-06-15 65 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)是你的意思有。