Po mnoha hodinách, kdy jsem se snažil izolovat části mého kódu za účelem vyřešení tohoto problému, jsem si všiml, že chyba zmizela po nastavení příznaku ATTR_EMULATE_PREPARES na hodnotu true.
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
To říká PDO, aby emulovalo připravené příkazy namísto nativně MySQL. Z toho, co jsem četl, se obecně doporučuje tento příznak vypnout (ve výchozím nastavení je to pravda), pokud používáte nejaktuálnější verzi MySQL a PHP. Více informací o tom najdete v tomto SO článek .
Domnívám se, že se jedná o chybu MySQL (tento problém jsem měl až do verze 5.6.17). O tomto konkrétním problému se moc nediskutuje, takže doufejme, že to někomu jinému ušetří hodiny řešení problémů. Problém je také diskutován na této stránce s chybami MySQL , ale zaslané řešení mi v mé situaci nepomohlo.