echo $begrüßung;
Oder habe ich mir auf dem Weg in die Datenbank irgendwo die Kodierung zerschossen und das was dort gespeichert wird ist gar kein UTF-8?
MySQL interpretiert die Daten in dem Fall als Latin1. Also jedes Byte einer UTF-8-Sequenz als eigenständiges Zeichen.
Das ist eigentlich nicht korrekt, aber solange du die Daten mit dem gleichen Fehler in die Datenbank schreibst, wie du sie auslest, funktioniert es (wie du gemerkt hast) trotzdem ;-)
Es hört dann auf zu funktionieren, wenn man Stringoperationen (Sortieren, Vergleichen, Teilstrings bilden) in MySQL machen möchte.
Korrekt wäre, für die Verbindung zur Datenbank noch mal UTF-8 zu wählen, was mit
SET NAMES UTF8
geschehen sollte. Siehe auch im MySQL Manual unter Verbindungszeichensatz.
Eigentlich ist es besser, die dafür vorgesehene Funktion der MySQL-Client-API zu verwenden: mysql_set_character_set(). Somit erfährt auch die Client-API und nicht nur der Server von der zu verwendenen Kodierung und lässt mysql_real_escape_string() korrekt arbeiten. Dies ist allerdings für ISO-8859-X/LatinX und UTF-8 nicht so wichtig. Für diese Kodierungen reicht auch SET NAMES.
PHP kennt ein Pendant zu dieser Funktion für die mysqli-Extension schon lange (mysqli_set_charset()), für die mysql-Extension erst seit 5.2.3 (mysql_set_charset())
echo "$verabschiedung $name";