存储由0和1

时间:2016-05-06 08:43:19

标签: mysql sql sqldatatypes

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

  • null
  • 0
  • /* the length of other numbers is always 7 digits */
  • 0000000
  • 0000001
  • 0000010
  • 0000011
  • /* and so on */
  • 1111111

我已经测试过,INT也可以使用。但是有一个更好的数据类型。因为我的所有号码都是01位数。有没有更好的数据类型?

4 个答案:

答案 0 :(得分:2)

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

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

只需存储为varchar(7)或MySql中的等效内容。不需要聪明,特别是因为你有兴趣提取位置值。

不要忘记要记住,这比存储为bit(7)需要更多的存储空间,因为你实际上存储了7个字节(或者存储单元用于每个精度等级的存储单元) varchar),而不是7位。

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

答案 1 :(得分:1)

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

MySQL中还有一些有用的位功能。

答案 2 :(得分:1)

您可以将二进制数转换为字符串,并使用附加字节指定前导零的数量。

示例 - 010的表示形式:

  • 十六进制的数值为0x02
  • 有一个前导零,因此第一个字节为0x01
  • 结果字符串为0x01,0x02

使用相同的方法,1010010应表示为0x00,0x52

对我而言非常有效。

答案 3 :(得分:1)

您展示的是二进制数

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

因此,只需将这些数字存储在整数数据类型中(当然,内部存储的位如下所示)。根据按位操作(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)

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