【发布时间】:2012-10-02 20:56:23
【问题描述】:
我很好奇为什么 SHA256 的结果可以保存在 binary(32) 中,但它需要 varchar(64) 才能保存相同的结果。
我的意思是,256 位是 32 字节,因此,保存在 binary(32) 中非常有意义。但是,为什么要尝试将其保存在 varchar 中,每个字节都需要一个额外的字节呢?
【问题讨论】:
-
因为您收到的散列实际上是一个数字。当以二进制格式表示时,该数字是 1 和 0 的序列。但是,当您希望它通过字符表示时,对于十六进制数,您需要两个字符。这就是为什么二进制输出是 32 字节,字符一是 64。
-
我还是不明白。我正在尝试查看实际的原始数据,所以我使用的是 Python 的控制台。写入
a = 0b10101111将使a取值175(十进制)。以十六进制表示的相同值是 0xaf ->hex(0b10101111)。所以我有 8 个二进制字节,我以十六进制的0xaf结尾。所有丢失的字节在哪里? -
1 字节 =
10101111。当您获得原始输出时,原始输出的 1 个“字符”代表10101111。有32个这样的“字符”。当通过各种编辑器直接查看时,它们看起来是乱码,但是您可以将它们存储在binaryMySQL 列中。但是,对于那 1 个字节,当转换为十六进制时 - 它的字符表示是AF。因此,它需要 2 个 ASCII 字符来表示。 -
这是有道理的。谢谢,我现在明白了。
-
那 1 个字节代表一个数字。当然,这个数字可以用 ASCII 表示,你是对的。但是代码页呢?散列在每个代码页中看起来都一样吗?它不会,127 以上的代码是任意的,并且取决于代码页,并且对大多数人来说是不可读的。所以它必须被解释为一个数字(因为它是一个数字)。但是 ASCII 仅定义 0-9,因此您的数字中的 1 位数字 = 1 个字节。用 ASCII = 3 个字节将
10101111表示为175,因为每个数字是 1 个字符。因此,它表示为十六进制数。希望这能澄清一点。