我想知道存储这些数据的最佳数据类型是什么:
null
0
/* the length of other numbers is always 7 digits */
0000000
0000001
0000010
0000011
/* and so on */
1111111
我已经测试过,INT
也可以使用。但是有一个更好的数据类型。因为我的所有号码都是0
或1
位数。有没有更好的数据类型?
答案 0 :(得分:2)
正如您在评论中所说,值01
和1
不应被视为等效(它排除了二进制位置),因此您可以将其存储为字符串。
它实际上可能比存储为字节+偏移更有效,因为它将占用9个字符,而您最多需要7个字符
只需存储为varchar(7)
或MySql中的等效内容。不需要聪明,特别是因为你有兴趣提取位置值。
不要忘记要记住,这比存储为bit(7)
需要更多的存储空间,因为你实际上存储了7个字节(或者存储单元用于每个精度等级的存储单元) varchar),而不是7位。
如果这不是问题,则无需过度设计。
答案 1 :(得分:1)
不确定它是否是最佳数据类型,但您可能想尝试BIT: MySQL,PostgreSQL
MySQL中还有一些有用的位功能。
答案 2 :(得分:1)
您可以将二进制数转换为字符串,并使用附加字节指定前导零的数量。
示例 - 010
的表示形式:
0x02
。0x01
。0x01,0x02
。使用相同的方法,1010010
应表示为0x00,0x52
。
对我而言非常有效。
答案 3 :(得分:1)
您展示的是二进制数
因此,只需将这些数字存储在整数数据类型中(当然,内部存储的位如下所示)。根据按位操作(http://dev.mysql.com/doc/refman/5.7/en/bit-functions.html)的文档中的建议,您可以使用BIGINT。
以下是如何设置标志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)
但正如评论中所提到的:在关系数据库中,您通常使用列和表来显示属性和关系,而不是编码的标记列表。