Diese Seite beschreibt Calíope 1.5, die Version, die ich gerade baue. Die 1.4 ist im App Store für Mac, iPad, iPhone, Apple Watch, Apple TV und Apple Vision Pro. Das Changelog sagt, in welcher Version jede Funktion kam.

Fügt jedem Thema einen Button „In Calíope öffnen“ hinzu. Funktioniert nur mit installierter App.

Globale Suche

Was eine Suche kostet

Eine Suche innerhalb einer Spalte kann keine Indizes nutzen: Alles wird gelesen, und Calíope sagt vorher, wie viel.

Die Suche nach Text innerhalb einer Spalte kann keinen Index nutzen. Das ist keine Einschränkung von Calíope, sondern die Arbeitsweise relationaler Datenbanken: Ein Index kann nach dem Anfang eines Wertes ordnen, nicht nach dem, was in der Mitte steht.

Deshalb liest jede Suche alle Zeilen aller ausgewählten Tabellen. Darum sehen Sie vorher einen Hinweis, wie viele Tabellen durchsucht werden und wie viel Platz sie belegen.

So wird es schneller

- Wählen Sie nur die Tabellen, in denen die Suche sinnvoll ist.
- Beginnen Sie mit kleinen Tabellen, um den Text zu prüfen, und weiten Sie dann aus.
- Hinter einem SSH-Tunnel macht sich die Latenz deutlich bemerkbar.

Die angezeigte Größe stammt aus dem Serverkatalog und ist eine Schätzung: Bei stark genutzten Tabellen kann sie zu niedrig oder zu hoch liegen.

Stichwörter: Kosten, langsam, Indizes, Leistung, Größe, Durchlauf, große Tabellen

Warum mehr Zeilen gefunden als ersetzt werden

Die Suche folgt den Serverregeln und ignoriert die Groß-/Kleinschreibung, das Ersetzen nicht. Calíope zeigt den genauen Unterschied.

Das ist die wichtigste Falle dieses Werkzeugs, und darum zeigt Calíope sie, statt sie zu verstecken.

Suchen und Ersetzen vergleichen nicht gleich. Die Suche ignoriert meist die Groß- und Kleinschreibung: Die Suche nach foo findet auch Foo und FOO. Das Ersetzen unterscheidet dagegen immer und würde nur foo ändern.

MySQLMariaDBAurora

Über die Suche entscheidet die Kollation der Spalte, die in den meisten Datenbanken die Groß- und Kleinschreibung ignoriert; das REPLACE(), das schreibt, vergleicht Byte für Byte.

SQL Server

Die Suche folgt der Kollation der Spalte, die fast immer die Groß- und Kleinschreibung ignoriert. REPLACE() würde ihr ebenfalls folgen, daher lässt Calíope es mit der Variante derselben Kollation vergleichen, die Groß- und Kleinschreibung und Akzente unterscheidet: Was die Warnung zählt, ist das, was dieses Schreiben ändern würde.

PostgreSQL

Die Suche verwendet ILIKE, das die Groß- und Kleinschreibung unabhängig von der Kollation ignoriert; das replace(), das schreibt, vergleicht Zeichen für Zeichen.

Ohne Hinweis entsteht ein Ersetzen, das 300 Zeilen ankündigt und 100 ändert — ohne Fehler und ohne Meldung. Die Daten bleiben halb migriert.

Was Calíope tut

- Es zählt beides getrennt in derselben Abfrage und zeigt die Warnung mit beiden Zahlen.
- Neben der Gesamtzahl jeder Spalte steht, wie viele Zeilen wirklich ersetzbar sind.
- Die Vorschau zeigt nur Zeilen, die sich tatsächlich ändern.

Was Sie tun können

- Aktivieren Sie Groß-/Kleinschreibung beachten: Dann ist das Gefundene genau das, was ersetzt wird, und die Warnung verschwindet.
- Oder machen Sie mehrere Durchgänge, einen pro Schreibweise (foo, Foo, FOO).

Stichwörter: Groß-/Kleinschreibung, Kollation, Unterschied, Warnung, Abweichung

Welche Spalten ersetzt werden können

Durchsucht werden alle Textspalten, aber manche lassen sich nicht schreiben; Calíope sagt welche und warum.

Gesucht wird in allen Textspalten: kurzer und langer Text, feste Listen und JSON-Dokumente.

Ersetzt wird in vier Fällen nicht, und die Spalte trägt dann ein Schloss mit ihrem Grund:

GrundWarum
Der Server berechnet die SpalteIhr Wert stammt aus anderen Spalten; Schreiben bleibt wirkungslos
Nimmt nur Werte aus einer festen Liste anEin Ersetzen kann aus der Liste herausführen, und manche Server machen daraus ohne Warnung leeren Text
Teil des PrimärschlüsselsEine Änderung kann Beziehungen zu anderen Tabellen zerstören
Hat einen eindeutigen IndexDer neue Wert kann mit einem vorhandenen kollidieren

SQL Server

SQL Server hat keine Spalten mit fester Liste, hier sind es also drei Fälle. xml-Spalten werden ersetzt und müssen danach gültiges XML bleiben: Der Server lehnt ein Schreiben ab, das es zerstört.

PostgreSQL

In PostgreSQL sind die festen Listen ENUM-Typen. json- und jsonb-Spalten werden ersetzt und müssen danach gültiges JSON bleiben: Der Server lehnt ein Schreiben ab, das es zerstört.

Tabellen ohne Primärschlüssel werden nicht ersetzt, und das steht im Bestätigungsfenster. Ohne Schlüssel lassen sich einzelne Zeilen nicht identifizieren, und ein zu breiter Treffer würde Datensätze berühren, die niemand gesehen hat.

Sichten bleiben außen vor. Manche sind beschreibbar, aber herauszufinden welche, verlangt eine Analyse ihrer Definition — das Risiko lohnt nicht.

Stichwörter: Spalten, generiert, berechnet, enum, Primärschlüssel, eindeutig, json, Schloss, gesperrt

Ersetzen ohne Überraschungen

Ein Ersetzen führt immer über eine vom Server berechnete Vorschau, und Sie können das SQL in den Editor mitnehmen, statt es auszuführen.

Ein globales Ersetzen ist ein Massenschreiben über Daten, die Sie nicht einzeln gesehen haben. Darum lässt es sich nicht ohne das Prüffenster starten.

Was Sie sehen, bevor etwas geschrieben wird

1. Welche Tabellen und Spalten berührt werden und wie viele Zeilen jeweils.
2. Die Vorschau vorher → nachher, Zeile für Zeile.
3. Die zutreffenden Warnungen: der Abstand zwischen Gefundenem und Ersetzbarem, die gesperrten Spalten und die Fremdschlüssel, die von der Änderung abhängen.

Die Vorschau berechnet der Server mit derselben Operation, die auch schreiben wird. Es ist keine Simulation: Was Sie sehen, ist buchstäblich das, was gespeichert wird — samt Kürzungen durch die Maximallänge, die Sie sonst viel zu spät entdecken würden.

Skript ansehen liefert das vollständige SQL zum Kopieren, selbst Ausführen oder Aufbewahren. Diese Schaltfläche schreibt nichts.

Zwei weitere Bremsen

- Über tausend Zeilen muss die Zahl zur Bestätigung eingetippt werden.
- Jede Tabelle wird in einer eigenen Transaktion geschrieben, und danach werden die geänderten Zeilen mit den angekündigten verglichen. Stimmen sie nicht überein, wird es gesagt: Am Ende nennt eine Zeile unter dem Suchfeld die ersetzten Zeilen und, falls welche fehlen, in welchen Tabellen.

Es gibt kein Rückgängig. Wenn die Daten wichtig sind, legen Sie vorher eine Sicherung mit dem Backup-Werkzeug an.

Stichwörter: ersetzen, Vorschau, bestätigen, Skript, sql, Transaktion, rückgängig, Sicherung