Na vele uren te hebben besteed aan het isoleren van delen van mijn code om dit probleem op te lossen, merkte ik dat de fout verdween nadat ik de ATTR_EMULATE_PREPARES-vlag op true had gezet.
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
Dit vertelt PDO om de voorbereide verklaringen te emuleren in plaats van native door MySQL. Van wat ik heb gelezen, wordt het over het algemeen aanbevolen om deze vlag uit te schakelen (het is standaard waar) als je de meest up-to-date versie van MySQL en PHP gebruikt. Meer informatie hierover vind je in deze SO artikel .
Ik geloof echt dat dit een bug is met MySQL (ik had het probleem tot versie 5.6.17). Er is niet veel discussie over dit specifieke probleem, dus hopelijk bespaart dit iemand anders uren aan probleemoplossing. Het probleem wordt ook besproken op deze MySQL-bugpagina , maar de geposte oplossing hielp me niet in mijn situatie.