Tach!
Offensichtlich ist der Default-Wert für die Verbindung mit MySQL ein Ecoding, in dem Umlaute nicht existieren, so dass die UTF-8-kodierten Tabellendaten beim Transport von der Datenbank zu deinem Script umkonvertiert werden müssen – und das geht dann halt nicht verlustfrei.
Es gab auf der Verbindung keinen Verlust, der Defaultwert ist Latin1. MySQL hat das (zumindest im Falle der Umlaute) korrekt übersetzen können. Nur hat der Client angenommen, es sei UTF-8, das unverändert und auch als UTF-8 deklariert an den Browser geschickt. Der nun konnte die Latin1-Umlaute nicht als korrekte UTF-8-Sequenz erkennen und hat deshalb das Fragezeichen im Quadrat als Ersatz genommen.
Wenn es beim Übersetzen von UTF-8 nach Latin1 zu Verlusten kommt, wird ein normales Fragezeichen als Ersatz genommen. Das Fragezeichen im Quadrat existiert nicht in Latin1/ISO-8859-x.
dedlfix.