0

我刚刚发现除了VAR数据类型之外的所有类型都不会改变它们LENGTH的 s。这让我觉得效率极低,因为可能有INT像 anautoincrement PRIMARY这样的字段永远不会改变列中的1aBIGINT将占用完整的 8 个字节。

我有很多列一旦插入就不会改变,但有可能变大。我不想使用所有BIGINT列,而是想使用VARBINARY

我想将数据作为intc++ 中的数据进行操作,但将其存储为VARBINARYmysql 中。

如何在 C++ 中进行这些转换?

4

2 回答 2

3

强烈建议不要这样做。

如果您查看 MySQL 文档VARCHAR,您会看到

VARCHAR值存储为 1 字节或 2 字节长度前缀加上数据。长度前缀表示值中的字节数。

让我们取一个 64 位的值,例如 0xDEADBEEF2B84F00D。如果将其存储在BIGINT字段中,则需要 8 个字节(它存储为二进制值。)

如果您将其存储为VARCHAR,即使您假设数字始终是十六进制,我们说的是长度字段的 1 或 2 个字节,然后是十六进制字符的另外 16 个字节!18 个字节,并且由于必须与 ASCII 进行转换而损失了性能,这是一个可怕的权衡!

让我们看看相反的情况,0x01。存储在一个BIGINT字段中,它仍然是 8 个字节。使用与以前相同的约定,它在您的数据库中可能是 3 个字节。在我看来,甚至不值得。尤其是当您考虑到数据库在处理一堆 ASCII 数据时的性能有多差时。

只是不要这样做。按照设计的方式使用数据库。

于 2013-03-21T04:38:40.200 回答
1

我认为这是一个失败的提议。除非您可以证明您的数据根本不适合您的系统而不诉诸杂凑,否则我认为您最好坚持使用整数类型作为整数值。否则,如何防止有人在您的数字 ID 列中插入“你好”,以及查询看起来不像数字的数字有多高兴?总体上它可能也会更慢。

于 2013-03-21T04:35:35.877 回答