SQL-Formatierer & Dialekt-Konverter

SQL formatieren und zwischen MySQL, PostgreSQL und SQLite übersetzen. Jede Änderung wird aufgelistet, und was sich nicht sicher übersetzen lässt, wird gemeldet statt geraten — alles im Browser.

Auch als Desktop-App für Windows verfügbar.

Über dieses Tool

SQL wirkt portabel, und meistens ist es das auch — bis es das nicht mehr ist. Dieselbe Anweisung kann in MySQL und PostgreSQL Verschiedenes bedeuten, und die Unterschiede sind genau die Sorte, die keinen Fehler auslöst. PostgreSQL liest "name" als Bezeichner, MySQL als Zeichenkette. In MySQL ist || ein logisches ODER, in PostgreSQL eine Verkettung. Eine Abfrage, die man ohne diese Korrekturen umzieht, läuft weiter, liefert weiterhin Zeilen — die falschen.

Dieses Werkzeug tut zwei Dinge. Es formatiert SQL so, dass Klauseln, Listen und boolesche Bedingungen jeweils in eigenen Zeilen stehen, und es übersetzt zwischen MySQL, PostgreSQL und SQLite. Jede vorgenommene Umschreibung wird mit Vorher und Nachher aufgelistet — Sie können die Arbeit also prüfen, statt ihr zu vertrauen.

Was sich ohne Raten nicht übersetzen lässt, bleibt unangetastet und wird gesondert gemeldet: der ::-Cast, die UPSERT-Varianten, ILIKE, AUTO_INCREMENT, Storage-Engine-Optionen. Dort zu raten erzeugt syntaktisch gültiges SQL mit anderer Bedeutung — schlimmer als ein Fehler. Alles läuft im Browser; die eingefügte Abfrage wird nirgendwohin gesendet.

Häufige Fragen

Ändert das Formatieren das Verhalten meines SQL?
Nein. Der Formatierer verschiebt nur Leerraum und schreibt reservierte Wörter groß — er fügt kein Token hinzu, entfernt keines und ordnet keines um. Das wird durch einen Test abgesichert, der die formatierte Ausgabe erneut tokenisiert und dieselbe Token-Folge wie die Eingabe verlangt. Ein fehlendes Leerzeichen kann so nicht durchrutschen.
Warum wird manches nur gemeldet statt übersetzt?
Weil manche Unterschiede die Absicht kennen müssen. MySQLs || ist ein logisches ODER, in PostgreSQL verkettet dasselbe Symbol. MySQLs "abc" ist eine Zeichenkette, in PostgreSQL ein Spaltenname. Es gibt keine für beide Lesarten korrekte Umschreibung, deshalb wählt das Werkzeug nicht, sondern sagt Bescheid.
Ist MySQL LIMIT 50, 25 dasselbe wie LIMIT 25 OFFSET 50?
Ja. MySQL akzeptiert zusätzlich die Kurzform LIMIT offset, row_count; PostgreSQL und SQLite kennen nur LIMIT row_count OFFSET offset. Beim Konvertieren weg von MySQL wird die Kurzform in die Standardform umgeschrieben.
Warum werden ON DUPLICATE KEY UPDATE und ON CONFLICT nicht ineinander übersetzt?
Weil sie nicht äquivalent sind. ON CONFLICT verlangt ein Konfliktziel — die Spalten oder die Bedingung, die das Zusammenführen auslöst —, und das lässt sich aus einer ON DUPLICATE KEY-Anweisung nicht ableiten, die sich auf vorhandene Unique-Indizes verlässt. Das Ziel müssen Sie selbst benennen.
Können auch Stored Procedures oder komplette Schema-Dumps konvertiert werden?
Nicht zuverlässig. Prozeduren, Trigger und herstellerspezifisches DDL tragen weit mehr Dialekt-Details, als ein Formatierer verfolgen kann, und eine falsche Umschreibung ist dort teuer. Nutzen Sie es für Abfragen und einfaches DDL und behandeln Sie alles unter „Hier ist Handarbeit nötig" als wirklich urteilspflichtig.
Werden meine Abfragen irgendwohin gesendet?
Nein. Das Ganze ist schlichtes JavaScript im Browser — kein Server, keine Anfrage, kein Logging. Nach dem Laden funktioniert es auch offline; das ist ein guter Weg, die Aussage selbst zu prüfen.

Verwandte Tools