mysql - SHA() 方法对具有不同大小的二进制类型的相同值给出不同的结果

mysql - SHA() method gives different result for same value of binary type with different sizes

提问人:vasu 提问时间:9/29/2023 最后编辑:zealousvasu 更新时间:9/29/2023 访问量:34

问:

SHA() 方法对不同大小的相同二进制值给出不同的结果。

  1. 创建了一个表,列的大小为 X1 binary(1)、X2 binary(10)。

创建表TEST_binary10_2 ( PK bigint NOT NULL, VERSION int NOT NULL, X1 binary(1) DEFAULT NULL, X2 binary(10) DEFAULT NULL, PRIMARY KEY (PK));

  1. 为两列插入了相同的文本。

插入TEST_binary10_2值(2, 1, 3, 3);

  1. 尝试检索两者的 SHA(),即使它是相同的值,它也会返回不同的值。

从TEST_binary10_2中选择 PK、X1、X2、SHA(X1)、SHA(X2);

结果:您可以观察到 SHA(X1) 和 SHA(X2) 不同,即使 X1 和 X2 包含相同的字符串。我想知道原因和解决方案。enter image description here

SQL MySQL SHA1

评论


答:

2赞 ceejayoz 9/29/2023 #1

您可能想要而不是 .VARBINARYBINARY

https://dev.mysql.com/doc/refman/8.0/en/binary-varbinary.html

存储值时,它们会用填充值右填充到指定的长度。填充值为(零字节)。值使用 for 插入进行右填充,并且不会删除任何尾随字节以进行检索。所有字节在比较中都很重要,包括 和 操作。0x00和空间在比较上有所不同,0x00先于空间排序。BINARY0x000x00ORDER BYDISTINCT

对于 ,没有用于插入的填充,也没有剥离字节进行检索。所有字节在比较中都很重要,包括 和 操作。 和空间在比较上有所不同,排序在空间之前。VARBINARYORDER BYDISTINCT0x000x00

您正在与 .如果你仔细观察,你可以在输出屏幕截图中看到这一点;X2 列比它必须宽得多,而所有其他列都适合它们的(可见)内容。33\0\0\0\0\0\0\0\0\0

评论

0赞 vasu 9/29/2023
有没有办法在生成 SHA() 之前删除右填充。我正在尝试使用 SHA() 比较来自两个表的数据 – 我更改了表数据类型。
1赞 ceejayoz 9/29/2023
@vasu 你可以做类似的事情,但根据你的实际二进制数据,这可能不是一个好主意,而且在大表上效率很低。SHA(TRIM(TRAILING CHAR(0x00) FROM X2))
1赞 Bill Karwin 9/29/2023 #2

试试这个:

mysql> select hex(x1), hex(x2) from test_binary10_2;
+---------+----------------------+
| hex(x1) | hex(x2)              |
+---------+----------------------+
| 33      | 33000000000000000000 |
+---------+----------------------+

这表明两个二进制字符串并不相同。它们有不同的长度。后一列绑定为 10 字节的字节字符串,因为类型是固定长度的,必要时会用零填充。BINARY