PHPs sha1 funktion returnerar en strängrepresentation av ett hexadecimalt tal.
Vad det betyder är att om du skriver ut det på skärmen kommer det att visa ett hexadecimalt nummer. Men i minnet är det ett gäng ASCII-tecken.
Så ta det hexadecimala numret 1A2F . Som ASCII i minnet skulle det vara 0x31413246 , istället för 0x1A2F
MySQL:s normala gränssnitt skickar alla argument som strängar. När du använder det normala gränssnittet kommer MySQL att konvertera ASCII-strängen till ett binärt värde.
Den nya förberedda satsmetoden skickar allt som binärt. Så ditt fina värde på "1A2F" kommer nu att skickas som 0x31413246 och infogas i kolumnen. - källa:dev.mysql.com - Förberedda uttalanden
Konvertera istället din Hex-sträng genom att packa den till en binär sträng med:
$binId = pack("H*", $id); // this string is not ASCII, don't print it to the screen! That will be ugly.
och skicka sedan $binId till det MySQLi-förberedda uttalandet istället för $id.