针对varbinary列的MySQL SELECT

时间:2012-05-15 18:27:58

标签: mysql binary

这是我发布的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。感谢。

3 个答案:

答案 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')); 也应该是匹配的查询。