我需要在1个表中存储5个布尔值。 每个值都可以存储为tinyint(4)。所以,有5个tinyint(4)。 我想在一个tinyint(4)中放入5个布尔值。 我相信,每个人都比我更清楚,5位可以保存在1个字节中没有问题:) 第一个值可以存储为0(假)或1(真),第二个值可以存储为0(假)或2(真),第三个值可以存储为0或4,第四个值可以存储为0或8,第五个值可以存储为0或16。 因此,如果我们将这些值的总和存储在tinyint(4)中,我们确切地知道5个布尔值。
For example, stored 21 -> 16 + 4+1.
So, if 21 is stored, we know that:
Fifth=true
Fourth=false
Third=true
Second=false
First=true.
我的问题是: 仅保留1个变量是否有意义?我们赢得db volume(字节)和性能(少了4列,但这只有4个字节,而你实际上在同一个表中使用了varchar(1000)),但每次我们必须从“sum”中“提取”一个合适的布尔值“使用php功能,这种情况经常发生(假设当用户按下按钮时)。 将布尔值存储为1列中的总和是否都有意义,因此您有7列而不是11列?
这个值很清楚(因为那个表有更多的行只有2个),不是键。
谢谢。
答案 0 :(得分:6)
不要这样做 - 除非值是单个“不透明”的外部数据类型,例如标志枚举 - if列永远将在查询中使用,或者永远在所述“不透明”类型之外使用:使用离散/单独字段。(正确的)类型,正如jmucchiello和MarkR在他们的答案中指出的那样。)
尝试“为了性能”这里只会让你厌倦数据库 - 特别是这个 - 当你必须“修复”它或者稍后解决这个丑陋的方案时。 (如果你遇到性能问题,你会知道它...... 和知道足以在提出要求之前运行性能分析。)Donald Knuth说得对97%的东西只是不重要。所以让它漂亮,让数据库做你想做的事情。
快乐的编码。
如果我在上面发出动画,那是因为我正在尝试帮助别人避免我已经完成的相同错误遇到: - )
答案 1 :(得分:2)
不,这没有意义。
将每个存储在自己的列中,或者使用特定于MySQL的SET类型,它在内部使用位域,但更易于阅读。
担心每行几个字节真是个坏主意。这是一个令人难以置信的过早优化的案例。
答案 2 :(得分:1)
为什么不使用BIT Type让MySQL担心优化空间?