我刚刚发现除了VAR
数据类型之外的所有数据类型都不会改变它们的LENGTH
。由于可能INT
autoincrement
PRIMARY
字段可能永远不会改变1
列BIGINT
中的BIGINT
字段,因此这对我来说效率非常低8个字节。
我有很多列,一旦插入就不会改变但有可能变大。我不想使用所有VARBINARY
列,而是使用int
代替。
我想在c ++中将数据操作为VARBINARY
,并将其作为{{1}}存储在mysql中。
如何在c ++中进行这些转换?
答案 0 :(得分:3)
我高度建议不要这样做。
如果查看VARCHAR
的MySQL文档,您会看到
VARCHAR
值存储为1字节或2字节长度前缀加数据。长度前缀表示值中的字节数。
让我们采用像0xDEADBEEF2B84F00D这样的64位值。如果将其存储在BIGINT
字段中,则需要8个字节(它存储为二进制值。)
如果你将它存储为VARCHAR
,即使你假设数字总是十六进制,我们说的是长度字段的1或2个字节,然后是十六进制字符的另外16个字节! 18个字节,由于必须转换为/从ASCII转换而失去性能,这是一个可怕的权衡!
让我们看一下相反的情况,0x01。存储在BIGINT
字段中,它仍然是8个字节。使用之前的相同约定,它可能是数据库中的3个字节。在我看来,甚至还不值得。特别是当您考虑数据库使用一堆ASCII数据执行得有多糟糕时。
就是不要这样做。按照设计的方式使用数据库。
答案 1 :(得分:1)
我认为这是一个失败的主张。除非你可以证明你的数据不适合你的系统而不诉诸kludges,我认为你最好坚持使用整数类型的整数值。否则,什么是阻止某人在您的数字ID列中插入“hello”,以及您有多高兴查询看起来不像数字的数字?它整体上可能也会变慢。