1

这是我在此处发布的上一期的后续内容。

我创建了一个测试表:

CREATE TABLE `my_test_table` (
    `record_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
    `col1` BINARY(20) NULL DEFAULT NULL,
    `col2` CHAR(40) NULL DEFAULT NULL,
    PRIMARY KEY (`record_id`)
)

然后运行语句:

INSERT INTO my_test_table (col1, col2) VALUES(sha1('test'), sha1('test') );

数据看起来...

1 0x6139346138666535636362313962613631633463 a94a8fe5ccb19ba61c4c0873d391e987982fbbd3

我不确定如何针对 VARBINARY 列进行选择。我可以针对 CHAR 进行选择,例如:

SELECT * FROM my_test_table WHERE col2 = sha1('test');

我试过了

SELECT * FROM my_test_table WHERE col1 = hex(sha1('test'));

和其他变体,但似乎无法找到解决方案(如果有的话)。在允许新插入之前,我需要能够检查数据库中是否已经存在一个值。我正在根据以前的建议查看 VARBINARY 和 BINARY。谢谢。

4

3 回答 3

2

我没有读过你之前的问题,但是根据这个问题的源代码,你只将 sha1 哈希的前 20 个字符存储在 col1 中,所以如果你想选择它,你应该只查找前 20 个字符sha1 哈希。

例如:

SELECT * 
FROM my_test_table 
WHERE col1 = left(sha1('test'),20);
于 2012-05-15T18:35:48.127 回答
0
Data truncation: Data too long for column 'col1' at row 1: INSERT INTO my_test_table (col1, col2) VALUES(sha1('test'), sha1('test') )

这可能是您无法正确选择数据的原因吗?

于 2012-05-15T18:32:50.617 回答
0

顺便说一句,sha1('test')返回一个十六进制字符的字符串......

您应该在将unhex(sha1('test'))数据作为十六进制字符串输入时使用,否则它不会作为 acsii 值输入,这根本无法匹配

SELECT * FROM my_test_table WHERE col1 = unhex(sha1('test')); 也应该是匹配的查询。

于 2012-07-15T11:38:50.597 回答