【问题标题】:What use has mysql data type 'BINARY(0)'?mysql数据类型'BINARY(0)'有什么用?
【发布时间】:2019-09-17 07:28:40
【问题描述】:

现在我正在尝试学习 MySQL 的详细信息。 BINARY 类型需要的存储字节数与通过其参数提供的一样多,因此,例如,如果我将列定义为 BINARY(8),它会消耗 8 个字节。

https://dev.mysql.com/doc/refman/8.0/en/storage-requirements.html#data-types-storage-reqs-strings 网站上,有一个表将类型映射到它们的存储要求。它说我可以定义一个 BINARY(0)。但在我看来,这没有意义。 BINARY(0) 意味着我可以存储 0 个字节 - 所以什么也没有。我错过了什么吗?它有什么用处?或者是什么原因?

另一方面,我不能定义比 255 字节更大的 BINARY 列。我一直认为 255 的原因是您从 0 开始计数。但是当您不需要 BINARY(0) 时,您可以毫无问题地定义 BINARY(256)...

【问题讨论】:

  • 请不要在一篇文章中问两个问题。
  • 请记住该列可以为空。
  • “我无法定义比 255 字节更大的 BINARY 列。” 如果您需要更大,只需使用 BLOB(最大 65,535 字节)即可。

标签: mysql sqldatatypes


【解决方案1】:

我不得不四处寻找这个,因为我不了解自己。从this link可以看出BINARY(0)可以存储两种类型的值:

  • 空字符串

因此,您可以像使用不可为空的BIT(1) 列一样使用BINARY(0) 列,即作为真/假或是/否列。但是BINARY(0) 的存储要求只有一位,对于可为空的列不需要超出边界的额外存储。

由于BINARY(0) 列的非NULL 状态为空字符串,即转换为零,您可以使用以下命令查找所有此类记录:

SELECT *
FROM yourTable
WHERE bin_zero_column = 0;

可以使用WHERE bin_zero_column IS NULL 找到未标记的NULL 记录。

【讨论】:

  • BIT(1) 可以是01NULL。您也没有提到BINARY(0)0 字节的理论存储大小。
  • 嗯……如果你能区分NULL'',那么存储成本不可能为零。它需要物理存储上的至少一位状态来表示 NULL 与 ''。 (如果没有,那么我们就有了一种神奇的压缩机制的基础,它可以用零存储来表示数据......使用大量的BINARY(0) 列。)
  • Tim - 我也不是数据库专家。但这是基本的信息论。
  • 消耗1位的行中的列是否为空不是事实,而是它是否是否可以为空。可空列每行分配一个位来指示该行是否为空,因此每 8 个可空列每行需要 1 个字节的存储空间来存储该列是否为空的标志。因此,可为空的BINARY(0) 每行消耗 1 位存储空间,但只要这不会推动您超过可空列数的下一个 mod 8 边界,它就会免费使用,因为行消耗整个字节的存储空间,而不是位。
  • @armin.miedl 我相信 BIT 的细节由存储引擎决定,其中 InnoDB 将每一列分别存储在整数字节中,但是MyISAM 将它们打包在一起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-02
  • 2011-05-06
  • 1970-01-01
  • 2021-04-13
  • 2011-06-12
  • 1970-01-01
  • 2015-05-31
相关资源
最近更新 更多