gpt4 book ai didi

MySQL/MariaDB 固定长度的唯一 BLOB

转载 作者:太空宇宙 更新时间:2023-11-03 11:58:23 25 4
gpt4 key购买 nike

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

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

最佳答案

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

关于MySQL/MariaDB 固定长度的唯一 BLOB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30856409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com