【问题标题】:MySQL / MariaDB unique BLOB of fixed lengthMySQL / MariaDB 固定长度的唯一 BLOB
【发布时间】:2015-06-15 23:06:47
【问题描述】:

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

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

【问题讨论】:

  • 你试过 binary 还是 varbinary?
  • Workbench 不允许我将 BINARY 设置为 Unique。

标签: mysql blob biginteger mariadb


【解决方案1】:

您可以在 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)

【讨论】:

    【解决方案2】:

    BINARY(16) 是你想要的。

    【讨论】:

      猜你喜欢
      • 2011-12-27
      • 2016-01-16
      • 1970-01-01
      • 1970-01-01
      • 2020-12-31
      • 1970-01-01
      • 2019-10-30
      • 2019-12-12
      • 1970-01-01
      相关资源
      最近更新 更多