这是我发布的here上一期的后续内容。
我创建了一个测试表:
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一样选择CHAR:
SELECT * FROM my_test_table WHERE col2 = sha1('test');
我试过
SELECT * FROM my_test_table WHERE col1 = hex(sha1('test'));
和其他变化但似乎无法找到解决方案(如果有的话)。在允许新插入之前,我需要能够检查数据库中是否已存在值。我根据以前的建议看了VARBINARY和BINARY。感谢。
答案 0 :(得分:2)
我还没有看过你之前的问题,但基于这个问题的源代码,你只是在col1中存储sha1哈希的前20个字符,所以如果你想选择它,你应该只找第一个sha1哈希的20个字符。
例如:
SELECT *
FROM my_test_table
WHERE col1 = left(sha1('test'),20);
答案 1 :(得分:0)
Data truncation: Data too long for column 'col1' at row 1: INSERT INTO my_test_table (col1, col2) VALUES(sha1('test'), sha1('test') )
这可能是您无法正确选择数据的原因吗?
答案 2 :(得分:0)
BTW sha1('test')
返回一个十六进制字符的STRING ......
当您将数据作为十六进制字符串输入时,您应该使用unhex(sha1('test'))
,否则它将不会作为acsii值输入,而这些值根本无法匹配
SELECT * FROM my_test_table WHERE col1 = unhex(sha1('test'));
也应该是匹配的查询。