Die Daten einer Datenbank müssen vielfältig genutzt werden können und so kommt es nicht selten vor, dass mit MS-Programmen auf die DB zugegriffen wird, um etwa Pivot-Tabellen auszuwerten, Diagramme darzustellen oder um Adressdaten in Seriendokumenten einzufügen.

Nutzer der MySQL-Datenbank loben in diesem Zusammenhang die vielfältigen und einfachen Möglichkeiten des MySQL Servers im Bereich des Datenexports bzw. Datenimports. Schauen wir uns also kurz die Möglichkeiten an, die der MySQL Server bietet, um Daten extern zur Verfügung zu stellen:

Datenexport mit dem MySQL ­Query Browser

Am einfachsten ist es sicherlich, die Daten mittels des MySQL Query Browsers zu exportieren. Hierzu führen Sie zunächst wie gewohnt Ihre SQL-Abfrage aus (Bild 1). Anschließend stehen Ihnen über das Kontextmenü – wie in der Abbildung gezeigt – oder im Menü Datei C Ergebnismenge Exportieren verschiedene Exportformate zur Verfügung. Anschließend folgt noch ein Dialog, der es Ihnen ermöglicht, den Speicherort für die exportierte Datei zu bestimmen, und das war’s. Der MySQL Query Browser hat allerdings den Nachteil, dass Sie den Datenexport nicht automatisieren können und keinen Einfluss auf die Behandlung von Sonderzeichen haben.

Bild 1

Export von Textdateien

Um diese Probleme zu lösen und den Inhalt einer Tabelle möglichst effizient in eine Textdatei zu schreiben, stehen alternative Möglichkeiten zur Verfügung:

Das SQL-Kommando SELECT … INTO OUTFILE schreibt das Ergebnis einer Abfrage in eine Textdatei.

Wenn Sie den Export mit einem Unix-Skript automatisieren möchten, bietet sich auch der Befehl mysqldump an. Dieses ausführbare Skript bietet ähnliche Möglichkeiten wie das SQL Statement SELECT … INTO OUTFILE.

Und auch der Kommando-Interpreter mysql kann für den Datenexport genutzt werden.

Import von Textdateien

Aber nicht immer geht es darum Daten zu exportieren, manchmal müssen Daten auch importiert werden. So kann man sich z. B. vorstellen, dass Daten einer DB2-Tabelle importiert werden müssen. Oder Sie wollen die Tabellen-Engine konvertieren, dann müssten Sie z. B. die Daten einer MyISAM Tabelle zunächst exportieren und anschließend in eine InnoDB-Tabelle wieder importieren. Doch auch für den Datenimport stehen entsprechende Möglichkeiten zur Verfügung:

Die SQL-Anweisung LOAD DATA liest eine Textdatei und überträgt deren Inhalt in eine Tabelle.

Mysqlimport ist eine ausführbare Skriptdatei, die sich insbesondere dann empfiehlt, wenn der Import automatisiert werden soll.

Ein gemeinsames Merkmal aller Import- und Exportfunktionen sind die Optionen zur Behandlung von Sonderzeichen. Es existieren vier Optionen:

FIELDS TERMINATED BY ‚feldtrenner‘ – Diese Option bestimmt das Trennzeichen, das verwendet wird, um die Tabellenspalten zu trennen. Üblicherweise ist dies ein Tabulatorzeichen.

FIELDS ENCLOSED BY ‚enclosechar‘ – Üblicherweise werden Zeichenketten durch ein Sonderzeichen begrenzt. Dieses Zeichen können Sie individuell durch die Option ENCLOSED BY festlegen. Der Defaultwert ist hierfür häufig ein “ oder ein `. Beginnt ein Eintrag mit diesem Sonderzeichen, wird das Zeichen am Beginn und am Ende der Zeichenkette ignoriert.

FIELDS ESCAPED BY ‚escchar‘ – Das durch diese Option definierte Sonderzeichen kennzeichnet Sonderzeichen im String selbst. Dies ist erforderlich, wenn Zeichenketten der Textdatei Sonderzeichen enthalten, die gleichzeitig andere Funktionen wahrnehmen, z. B. Spalten oder Zeilen trennen.

LINES TERMINATED BY ’satzbegrenzer‘ –

Diese Option definiert das Satzendekennzeichen. Windows verwendet hierfür üblicherweise ‚

\r\n‘.

Außerdem müssen Sie – insbesondere beim Datenimport – die erwarteten Datenformate beachten. Der MySQL-Server erwartet z. B. für die Angabe der Dezimalstellen einen Dezimalpunkt. Datum und Uhrzeit werden als Zeichenketten in der Form yyyy‑mm‑tt bzw. hh:mm:ss behandelt. Eine Ausnahme bilden TIMESTAMP-Daten, die als Zahlen in der Form yyyymmtthhmmss verstanden werden. NULL-Werte sind etwas komplizierter. Gehen wir einmal davon aus, dass der Backslash

\ als Escape-Zeichen vereinbart wurde und dass “ zur Markierung von Zeichenketten verwendet wird. Beim Export stellen Sie in diesem Fall den Wert NULL durch \N dar. Wenn Sie ohne Backslash den Wert NULL exportieren, erhalten Sie einfach die Zeichenfolge NULL. NULL bzw. \N wird aber nicht durch “ “ als Zeichenkette gekennzeichnet und kann dadurch von Zeichenketten unterschieden werden. Beim Import von Daten akzeptiert MySQL NULL, \N sowie „\N“ als NULL. Die Zeichenfolge „NULL“ allerdings würde als Zeichenkette interpretiert werden. Detaillierte Informationen entnehmen Sie bitte dem MySQL-Referenzhandbuch.

Schauen wir uns aber zunächst einmal ein ganz einfaches Beispiel an:

Datenexport mit SELECT … INTO OUTFILE

Der Befehl SELECT … INTO ist eine ganz normale SQL-Anweisung, die beim My­SQL Server um den Zusatz INTO OUTFILE ergänzt werden kann. Die Anweisung schreibt die ausgewählten Datensätze direkt in eine Datei auf dem Server. Die Ausgabedatei darf allerdings zuvor nicht vorhanden ein. In erster Linie wird diese Anweisung eingesetzt, um eine Tabelle sehr schnell in eine Textdatei auf dem Server zu speichern.

SELECT authId, authname INTO OUTFILE

‚/tmp/autor.txt‘ FIELDS TERMINATED BY ‚,‘ OPTIONALLY ENCLOSED BY ‚“‚ LINES

TERMINATED BY ‚

\n‘ FROM authors;

Das Ergebnis finden Sie im Integrated File System Ihrer iSeries (Bild 2).

Bild 2

Datenexport mit der Skriptdatei mysqldump

Als Alternative zu SELECT … INTO OUTFILE steht das ausführbare Unix-Skript my-sqldump zur Verfügung. Eigentlich ist dieses Programm vorrangig als Backup-Programm gedacht, es speichert daher auch grundsätzlich ganze Tabellen. Ein weiterer Unterschied zu SELECT … INTO OUTFILE besteht darin, dass die Ergebnisdatei vollständige INSERT-Anweisungen enthält. Die Daten könnten daher mit SQL problemlos wieder eingelesen werden.

Schauen wir uns auch hierzu ein einfaches Beispiel an (Bild 3): Ich exportiere wieder die Tabelle authors. Als Ergebnis erhalte ich ein SQL-Skript, das nicht nur die Anweisung CREATE TABLE, sondern auch alle zugehörigen INSERT-Anweisungen erhält, um die Daten per SQL wieder einzulesen (Bild 4).

Bild 3

Bild 4

Derzeit müsste ich das Skript nachbearbeiten, wenn ich die Daten z. B. in eine DB2-Tabelle übernehmen möchte. Allerdings gibt es im Release V6R1 eine Neuerung, die die Portierung vereinfacht. Die DB2 SQL Engine ist mit dem Release V6R1 in der Lage, nicht unterstützte SQL-Anweisungen zu ignorieren. Laut IBM wird dadurch die Datenbankportierung deutlich beschleunigt. Leider war bisher noch keine Zeit, auszuprobieren, wie gut diese Eigenschaft tatsächlich ist!

Das Unix-Skript mysqldump ist aber auch in der Lage, echte Textfiles zu erstellen. Dafür muss lediglich der Befehl ein klein wenig verändert werden. Damit Sie mysqldump für den Textexport einsetzen können, müssen Sie die Option - -tab verwenden. Die Option benennt das Verzeichnis, in dem das Ergebnis gespeichert werden soll. Dieses Verzeichnis enthält nach der Befehlsausführung für jede exportierte Tabelle zwei Dateien:

Die erste Datei mit der Endung TXT enthält die Daten.

Die zweite Datei mit der Endung SQL enthält den entsprechenden Befehl CREATE TABLE.

Ich exportiere wiederum die Tabelle authors der Datenbank book (Bild 5).

Bild 5

Als Ergebnis werden die beiden oben beschriebenen Dateien im angegebenen Verzeichnis erzeugt. Das Verzeichnis muss im Übrigen vor der Befehlsausführung bereits vorhanden sein, und Sie benötigen natürlich auch die entsprechenden Schreibrechte. In der TXT-Datei befinden sich in diesem Fall die eigentlichen Daten. In der SQL-Tabelle steht nur noch der Befehl CREATE

TABLE. Um wie im vorangegangenen Beispiel die Satzendekennzeichen und dergleichen zu definieren, müssen Sie die Optionen: - -fields-terminated-by, - -fields-enclosed-by, - -fields-escaped-by und - -lines-terminated-by verwenden.

Auf diesem Weg ist auch ein XML-Export möglich. Wenn Sie mysqldump mit der Option - -XML ausführen, erhalten Sie eine XMl-Datei. Per Default wird UTF8 als Unicode-Zeichensatz verwendet. Mit der Option - -default-character-set können Sie aber auch einen beliebigen anderen Zeichensatz einstellen.

Export mit der ausführbaren Skriptdatei mysql

Der Kommando-Interpreter mysql kann u. a. auch dazu verwendet werden, SQL-Abfragen im Batch-Modus auszuführen und das Ergebnis in einer Textdatei zu speichern. mysql zeichnet sich im Gegensatz zu mysqldump dadurch aus, dass die resultierende Textdatei auf einem Client gespeichert werden kann. Im einfachsten Fall nutzen Sie mysql für den Export folgendermaßen (Bild 6):

Mit der Option - -execute übergebe ich die auszuführende SQL-Anweisung, wobei die Option selbst in Hochkommata eingeschlossen werden muss. In der Ergebnisdatei sind die einzelnen Spalten durch Tabulatorzeichen getrennt und die erste Zeile enthält die Spaltenüberschriften.

Bild 6

Wenn Sie anstelle der Option - -batch die Option - -html verwenden, erzeugt mysql eine HTML-Datei – allerdings ohne HTML-Header (Bild 7). Das Ergebnis sehen Sie in Bild 8. Genauso ist es möglich, - -xml als Option zu verwenden, um XML-Dateien zu erzeugen.

Bild 7

Bild 8

Sie sehen, dass der MySQL Server vielfältige Möglichkeiten bereithält, um Daten zu exportieren. Detaillierte Informationen zu den vorgestellten Möglichkeiten finden Sie im entsprechenden MySQL-Referenzhandbuch.