2012-05-15 86 views
1

這是我之前發佈的一個後續問題hereMySQL SELECT against varbinary column

我創建了一個測試表:

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。謝謝。

+0

爲什麼是二進制類型的列? –

回答

2

我還沒有讀過你以前的問題,但是根據這個問題的源代碼,你只是將sha1哈希的前20個字符存儲在col1中,所以如果你想選擇它,你應該只是尋找sha1哈希的前20個字符。

例如:

SELECT * 
FROM my_test_table 
WHERE col1 = left(sha1('test'),20); 
+0

工作。我很困惑,爲什麼它在我的MySQL編輯器中顯示爲「0x6139346138666535636362313962613631633463」。我有什麼理由擔心前20個比40個字符串更隨機? – Don

+0

當然,使用20個字符相比,40的碰撞機會要高得多。你應該對散列衝突進行一些研究,並決定哪個散列函數適合你。 –

+0

謝謝。我只是因爲其他建議將散列值存儲爲二進制而感到困惑,但如果這在進行比較時限制它的唯一性,我認爲CHAR可能會更好。感謝各地的幫助。 – Don

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

這是您無法正確選擇數據的原因嗎?

+0

可能是我複製的源中的錯誤。我能夠插入確定,並可以在SELECT * – Don

+0

後看到我的表中的結果嗯,我試圖幫助你給了我什麼。當它明顯不起作用時,試圖猜測你的意思並不是我的責任。下一次,嘗試你最好的張貼工作代碼:) –

+0

對不起。在我的答覆中並不意味着簡短。我感謝你的幫助,並同意這是垃圾垃圾。第一個答覆足以讓我走向正確的方向,所以我就這樣做了。感謝幫助。 – Don

0

BTW的sha1('test')返回的十六進制字符的字符串...

輸入查詢時,爲十六進制字符串數據,否則它不會被輸入作爲ACSII您應該使用unhex(sha1('test'))值不會與匹配匹配

SELECT * FROM my_test_table WHERE col1 = unhex(sha1('test')); 也應該是匹配查詢。