存储由 0 和 1 组成的长数字的最佳数据类型

Best datatype to store a long number made of 0 and 1

我想知道存储这些的最佳数据类型是什么:

我测试过,INT 也可以。但是有更好的 datatype。因为我所有的数字都是由 01 数字组成的。有没有更好的数据类型?

不确定它是否是最佳数据类型,但您可能想尝试 BIT: MySQL, PostgreSQL

MySQL中还有一些有用的位函数。

您可以将二进制数转换为字符串,并使用一个额外的字节来指定前导零的数量。

示例 - 010 的表示:

  • 十六进制数值为0x02
  • 有一个前导零,所以第一个字节是0x01
  • 结果字符串为0x01,0x02.

用同样的方法,1010010应该表示为0x00,0x52

在我看来效率很高。

正如您在评论中所说,值 011 不应被视为等价的(这排除了二进制文件所在的位置),因此您可以将其存储为一个字符串。

它实际上可能比存储为字节 + 偏移量更有效,因为这将占用 9 个字符,而您最多需要 7 个字符

只需存储为 varchar(7) 或 MySql 中的任何等效项。无需对此很聪明,尤其是因为您对提取位置值感兴趣。

不要忘记记住,这比存储为 bit(7) 占用更多的存储空间,因为您实际上存储 7 个字节(或每个精度级别的存储单元)在 varchar 中),而不是 7 位。

如果这不是问题,则无需过度设计。

你显示的是二进制数

  • 0000000 = 0
  • 0000001 = 2^0 = 1
  • 0000010 = 2^1 = 2
  • 0000011 = 2^0 + 2^1 = 3

因此,只需将这些数字存储在整数数据类型中(当然,它在内部存储为位)。您可以为此使用 BIGINT,正如文档中针对按位运算 (http://dev.mysql.com/doc/refman/5.7/en/bit-functions.html) 所建议的那样。

这里是设置标志 n 的方法:

UPDATE mytable
SET bitmask = POW(2, n-1)
WHERE id = 12345;

添加标志的方法如下:

UPDATE mytable
SET bitmask = bitmask | POW(2, n-1)
WHERE id = 12345;

检查标志的方法如下:

SELECT *
FROM mytable
WHERE bitmask & POW(2, n-1)

但如评论中所述:在关系数据库中,您通常使用列和表来显示属性和关系,而不是编码标志列表。