2016-04-17 12 views
0

Ich versuche, einen Vergleich auf Hash-Werte (hexadezimale Zeichenfolgen von 16 Zeichen) durchzuführen. Ich habe eine MYSQL-Tabelle, die diese Werte mit einer phash VARCHAR(16) Spalte speichert. Dies ist, was ich zu tun versucht:Problem mit bitweisem xor + bit_count in mysql

SELECT phash, bit_count(phash^x'dda15873a3de013d') FROM mytable; 

Aber die BIT_COUNT + xor ist nicht richtig gemacht. Auch für phash='dda15873a3de013d' ich 33 als Ergebnis erhalten, während ich 0 (die beiden hex sind die gleichen bekommen sollte, so sollte die xor nur Nullen ergeben, also eine BIT_COUNT von 0.

Was ist falsch? Danke

Edit:.. Beispiel hier =>http://sqlfiddle.com/#!9/d7f5c2/1/0

mysql> SELECT phash,BIT_COUNT(CONV(phash, 16, 10)^0xdda15873a3de012d) from mytable limit 1; 

+------------------+-----------------------------------------------------+ 
| phash   | BIT_COUNT(CONV(phash, 16, 10)^0xdda15873a3de012d) | 
+------------------+-----------------------------------------------------+ 
| dda15873a3de012d |             33 | 
+------------------+-----------------------------------------------------+ 
+0

Funktioniert für mich: http://sqlfiddle.com/#!9/9eecb7d/54806. Welchen Datentyp hat 'phash'? –

+0

Es ist VARCHAR (16) – David

+0

siehe http://sqlfiddle.com/#!9/d7f5c2/1/0 – David

Antwort

0

Der MySQL ^ Operator nur auf ganze Zahlen funktioniert Es kann nicht zu XOR-Strings verwendet werden (oder Blobs) miteinander

Wenn speziell die Saiten hexadezimal ganze Zahlen darstellen, können Sie ^ nach dem Konvertieren sie auf ganze Zahlen verwenden:

SELECT BIT_COUNT(CONV(phash, 16, 10)^0xdda15873a3de013d) 
+0

Leider bekomme ich immer noch 33 statt 0. Ich habe meine Frage bearbeitet, um das Ergebnis zu zeigen, das ich für diese Abfrage bekomme (besser lesbar als in den Kommentaren) – David

+0

siehe http://sqlfiddle.com/#!9/d7f5c2/8/0 (Entschuldigung zum Bearbeiten) – David

0

CONV einen String zurückgibt. Sie müssen das Ergebnis von CONV auf UNSIGNED umwandeln.