@rickes6g: Die Erklärung zu UTF-8 kann ich nicht nachvollziehen. Wie gesagt, innerhalb von Programmen arbeitet man mit Textdaten als Unicode-Objekte, also `unicode` in Python 2 und `str` in Python 3. Nur an den ”Grenzen” zur Aussenwelt dekodiert man eingehende Daten und kodiert man ausgehende Daten. Und das sollte man wann immer möglich die jeweilige Schnittstelle erledigen lassen und nicht manuell selber machen.
Du kannst Dir nichts ”in” der Datenbank anschauen. pgAdmin ist ein Programm das sich mit der Datenbank verbindet, und dabei von einer Kodierung ausgeht. Und die Datenbank geht auch von einer Kodierung aus. Das sollte besser die gleiche Kodierung sein, muss es aber nicht. Das heisst wenn die Daten so angezeigt werden, kann es sein das die so kaputt in der Datenbank liegen, es kann aber auch sein das sich pgAdmin und die Datenbank nicht über die Kodierung einig sind und pgAdmin die falsch darstellt. Es kann sogar sein das man kaputte Daten in der Datenbank stehen hat und pgAdmin die richtig anzeigt, nämlich wenn beim Eintragen in die Datenbank und beim Auslesen jeweils die falsche Annahmen über die Kodierung gemacht wurden. Kodierung ist ein lustiges Thema.
ODBC ist noch eine weitere Schicht zwischen Programm und Datenbank. Also statt `programm <-> db client <-> db server` hat man dann `programm <-> odbc <-> db client <-> db server`. Wenn es keinen guten Grund für die Zwischenschicht gibt, würde ich sie weglassen. Ich weiss nicht ob ODBC Ahnung von Kodierungen hat oder nur Bytes durchreicht, aber wenn man auch dort mit Kodierungen zu tun hat, sind auch dort zwei Kodierungseinstellungen die falsch sein könnten.
Und da ich persönlich immer SQLAlchemy für Datenbankzugriffe verwende: Das unterstützt PostgreSQL nicht über ODBC.