MySQL SQL Formatter

Füge eine MySQL-Abfrage ein — auch eine direkt aus Anwendungs-Logs kopierte, in der die ?-Platzhalter noch stehen — und erhalte lesbares, konsistent formatiertes SQL. Identifier in Backticks und MySQL-spezifische Funktionen bleiben erhalten.

Eine MySQL-Abfrage, vorher und nachher

Die unformatierte Abfrage unten ist das Beispiel aus dem Editor weiter oben, und die Ausgabe ist genau das, was dieser Formatter mit den Standardoptionen dafür liefert. Nichts davon wurde von Hand nachgebessert.

Eingefügt
SELECT `u`.`id`, `u`.`name`, count(o.id) AS orders, sum(o.total) AS revenue FROM `users` `u` LEFT JOIN `orders` `o` ON o.user_id = u.id WHERE u.created_at >= ? AND u.status = ? AND o.region IN (?) GROUP BY u.id, u.name HAVING sum(o.total) > ? ORDER BY revenue DESC LIMIT 50
Formatierte Ausgabe
SELECT
  `u`.`id`,
  `u`.`name`,
  count(o.id) AS orders,
  sum(o.total) AS revenue
FROM
  `users` `u`
  LEFT JOIN `orders` `o` ON o.user_id = u.id
WHERE
  u.created_at >= ?
  AND u.status = ?
  AND o.region IN (?)
GROUP BY
  u.id,
  u.name
HAVING
  sum(o.total) > ?
ORDER BY
  revenue DESC
LIMIT
  50

MySQL-Syntax, die er beherrscht

Ein generischer Formatter verstümmelt dialektspezifische Syntax oder lehnt sie gleich ab. Das sind die MySQL-Konstrukte, gegen die dieser Formatter getestet wird.

?

Positionelle Platzhalter werden nach der Spalte und dem Operator gruppiert, bei denen sie stehen, sodass eine zweimal verglichene Spalte nur einmal ausgefüllt wird.

`identifier`

Identifier in Backticks behalten ihre Anführung und ihre Schreibweise.

ON DUPLICATE KEY UPDATE

MySQL-eigene Anweisungsklauseln werden formatiert statt als undurchsichtiger Block durchgeleitet.

STRAIGHT_JOIN

MySQL-Join-Hints und Index-Hints bleiben an ihrer Stelle.

FAQ zum MySQL-Formatter

Kann ich eine Abfrage mit ?-Platzhaltern direkt aus meinen Logs einfügen?

Ja. Das ist der häufige Fall. Die ?-Platzhalter werden erkannt und nach der Spalte gruppiert, mit der sie verglichen werden, sodass eine wiederholte Spalte einmal ausgefüllt wird. Danach kannst du die Ausgabe auf ausgefülltes SQL schalten und eine ausführbare Abfrage erhalten.

Funktioniert das auch für MariaDB?

Ja — wähle MariaDB in der Dialektliste für MariaDB-spezifische Schlüsselwörter, oder nutze MySQL, das die gemeinsame Syntax abdeckt.

Bleibt die Schreibweise von Bezeichnern in Backticks erhalten?

Ja. Die Schreibweise von Schlüsselwörtern und die von Bezeichnern sind getrennte Optionen. Sie können SELECT und JOIN gross schreiben, während eine Spalte wie userProfile ihr camelCase behält. Bei MySQL wiegt das schwerer als anderswo, weil die Gross- und Kleinschreibung von Tabellennamen vom Dateisystem des Servers abhängt.

Kann er eine MySQL-Abfrage wieder auf eine Zeile minifizieren?

Ja. Das Minifizieren staucht die Abfrage zum Zurückkopieren in den Anwendungscode und schreibt niemals Leerzeichen innerhalb eines String-Literals um — ein Vergleich mit einem Wert, der zwei Leerzeichen enthält, liefert danach weiterhin dieselben Zeilen.

Formatiert er ein Fragment aus einer Logzeile?

Ja. Eine unvollständige Abfrage — oder ein blosses WHERE u.created_at >= ? AND u.status = ? — wird ohne das umgebende SELECT formatiert und bearbeitbar gemacht. Genau so sieht die Ausgabe des Slow-Query-Logs und des General Logs von MySQL aus, und genau dafür ist dieser Formatierer gebaut.

Werden ON DUPLICATE KEY UPDATE und Index-Hints unterstützt?

Ja. MySQL-eigene Klauseln werden als echte Klauseln formatiert, statt als unformatierter Block durchgereicht zu werden, und Join- oder Index-Hints wie STRAIGHT_JOIN und FORCE INDEX bleiben an der Tabelle, die sie qualifizieren.