提问人:vasu 提问时间:9/29/2023 最后编辑:zealousvasu 更新时间:9/29/2023 访问量:34
mysql - SHA() 方法对具有不同大小的二进制类型的相同值给出不同的结果
mysql - SHA() method gives different result for same value of binary type with different sizes
问:
SHA() 方法对不同大小的相同二进制值给出不同的结果。
- 创建了一个表,列的大小为 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
));
- 为两列插入了相同的文本。
插入TEST_binary10_2值(2, 1, 3, 3);
- 尝试检索两者的 SHA(),即使它是相同的值,它也会返回不同的值。
从TEST_binary10_2中选择 PK、X1、X2、SHA(X1)、SHA(X2);
结果:您可以观察到 SHA(X1) 和 SHA(X2) 不同,即使 X1 和 X2 包含相同的字符串。我想知道原因和解决方案。
答:
您可能想要而不是 .VARBINARY
BINARY
https://dev.mysql.com/doc/refman/8.0/en/binary-varbinary.html
存储值时,它们会用填充值右填充到指定的长度。填充值为(零字节)。值使用 for 插入进行右填充,并且不会删除任何尾随字节以进行检索。所有字节在比较中都很重要,包括 和 操作。0x00和空间在比较上有所不同,0x00先于空间排序。
BINARY
0x00
0x00
ORDER BY
DISTINCT
对于 ,没有用于插入的填充,也没有剥离字节进行检索。所有字节在比较中都很重要,包括 和 操作。 和空间在比较上有所不同,排序在空间之前。
VARBINARY
ORDER BY
DISTINCT
0x00
0x00
您正在与 .如果你仔细观察,你可以在输出屏幕截图中看到这一点;X2 列比它必须宽得多,而所有其他列都适合它们的(可见)内容。3
3\0\0\0\0\0\0\0\0\0
评论
SHA(TRIM(TRAILING CHAR(0x00) FROM X2))
试试这个:
mysql> select hex(x1), hex(x2) from test_binary10_2;
+---------+----------------------+
| hex(x1) | hex(x2) |
+---------+----------------------+
| 33 | 33000000000000000000 |
+---------+----------------------+
这表明两个二进制字符串并不相同。它们有不同的长度。后一列绑定为 10 字节的字节字符串,因为类型是固定长度的,必要时会用零填充。BINARY
评论