存储由 0 和 1 组成的长数字的最佳数据类型
Best datatype to store a long number made of 0 and 1
我想知道存储这些的最佳数据类型是什么:
null
0
/* the length of other numbers is always 7 digits */
0000000
0000001
0000010
0000011
/* and so on */
1111111
我测试过,INT
也可以。但是有更好的 datatype。因为我所有的数字都是由 0
或 1
数字组成的。有没有更好的数据类型?
不确定它是否是最佳数据类型,但您可能想尝试 BIT:
MySQL, PostgreSQL
MySQL中还有一些有用的位函数。
您可以将二进制数转换为字符串,并使用一个额外的字节来指定前导零的数量。
示例 - 010
的表示:
- 十六进制数值为
0x02
。
- 有一个前导零,所以第一个字节是
0x01
。
- 结果字符串为
0x01,0x02
.
用同样的方法,1010010
应该表示为0x00,0x52
。
在我看来效率很高。
正如您在评论中所说,值 01
和 1
不应被视为等价的(这排除了二进制文件所在的位置),因此您可以将其存储为一个字符串。
它实际上可能比存储为字节 + 偏移量更有效,因为这将占用 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)
但如评论中所述:在关系数据库中,您通常使用列和表来显示属性和关系,而不是编码标志列表。
我想知道存储这些的最佳数据类型是什么:
null
0
/* the length of other numbers is always 7 digits */
0000000
0000001
0000010
0000011
/* and so on */
1111111
我测试过,INT
也可以。但是有更好的 datatype。因为我所有的数字都是由 0
或 1
数字组成的。有没有更好的数据类型?
不确定它是否是最佳数据类型,但您可能想尝试 BIT: MySQL, PostgreSQL
MySQL中还有一些有用的位函数。
您可以将二进制数转换为字符串,并使用一个额外的字节来指定前导零的数量。
示例 - 010
的表示:
- 十六进制数值为
0x02
。 - 有一个前导零,所以第一个字节是
0x01
。 - 结果字符串为
0x01,0x02
.
用同样的方法,1010010
应该表示为0x00,0x52
。
在我看来效率很高。
正如您在评论中所说,值 01
和 1
不应被视为等价的(这排除了二进制文件所在的位置),因此您可以将其存储为一个字符串。
它实际上可能比存储为字节 + 偏移量更有效,因为这将占用 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)
但如评论中所述:在关系数据库中,您通常使用列和表来显示属性和关系,而不是编码标志列表。