MySQL根据varbinary列进行选择

MySQL根据varbinary列进行选择,mysql,binary,Mysql,Binary,这是我之前发布的一期的后续文章 我创建了一个测试表: 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 m

这是我之前发布的一期的后续文章

我创建了一个测试表:

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 0x61393461386635636362313962613631633463 a94a8fe5ccb19ba61c4c0873d391e987982fbbd3

我不确定如何针对VARBINARY列进行选择。我可以根据字符进行选择,如:

SELECT * FROM my_test_table WHERE col2 = sha1('test');
我试过了

SELECT * FROM my_test_table WHERE col1 = hex(sha1('test'));
和其他变化,但似乎无法找到解决方案(如果有)。在允许新的插入之前,我需要能够检查数据库中是否已经存在值。我在看VARBINARY和基于前面建议的BINARY。谢谢

Data truncation: Data too long for column 'col1' at row 1: INSERT INTO my_test_table (col1, col2) VALUES(sha1('test'), sha1('test') )

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

我没有阅读您之前的问题,但根据此问题中的源代码,您只将sha1哈希的前20个字符存储在col1中,因此如果您要选择它,您应该只查找sha1哈希的前20个字符

例如:

SELECT * 
FROM my_test_table 
WHERE col1 = left(sha1('test'),20);
顺便说一句,
sha1('test')
返回一个十六进制字符字符串

当以十六进制字符串的形式输入数据时,应该使用
unhex(sha1('test'))
,否则它将不会作为acsii值输入,而acsii值与匹配完全不起作用

从my_test_表中选择*,其中col1=unhex(sha1('test')

也应该是匹配的查询。

为什么列的类型为binary?可能是我复制的源中的错误。我可以插入ok,并且可以在选择后在我的表中看到结果。好吧,我试图帮助你给我什么。当它显然不起作用时,我没有义务去猜测你的意思。下一次,请尽量发布工作代码:)对不起。我的回答并不想简短。我感谢你的帮助,并同意这是垃圾输入-垃圾输出。第一个回答足以让我走上正确的方向,所以我就这样做了。谢谢你的帮助,这很有效。我不明白为什么它在我的MySQL编辑器中显示为“0x6139346138666535636262313962613631633463”。我有什么理由担心前20个字符的随机性比40个字符的字符串小?当然,使用20个字符与40个字符相比,发生冲突的可能性要大得多。您应该对哈希冲突进行一些研究,并确定哪个哈希函数适合您。谢谢。我只是感到困惑,因为其他建议是将散列值存储为二进制,但如果这限制了它在进行比较时的唯一性,我认为CHAR可能更好。感谢您的帮助。是的,如果您将哈希值存储为二进制,则可以将其存储为20个字节,而不是40个字节的字符。缺少的部分是您需要使用
UNHEX
将散列值转换为二进制。这样:
将值(unhex(sha1('test'))、sha1('test'))插入我的测试表(col1,col2)
,然后您可以像这样选择数据:
从my_test_表中选择*,其中col1=unhex(sha1('test')