| Ein 'Dump' ist die Standard-Methode, um Strukturen und Daten von Datenbanken ßerhalb des SQL-Servers zu verwenden. | Dump-Filess sind reine Text-Dateien und werden zur Sicherung, sowie für Transport und Übersiedelung eingesetzt. |
SQL
|
Die Datenbank-'Sprache' (Standard Query Language) |
| Dump | Erklärung und Beispiel |
| Text-Export | Die Übersiedlung von Daten |
| Fixe Länge | Export von Datensätzen fixer Länge |
| Variable Länge | Export von Datensätzen variabler Länge |
DUMP |
|
SQL-DumpEin Dump ist die Standard-Methode für Transport, Sicherung und Übersiedlung von Strukturen und Daten im Umfeld von SQL-Servern.Jeder Dump besteht aus beliebig vielen SQL-Anweisungen, die in Text-Dateien gesammelt sind. Struktur & DatenEs ist vorteilhaft, Struktur und Daten zu trennen:Ein Struktur-Dump (Beispiel rechts oben) enthält alle Befehle zur Herstellung einer kompletten Datenbank-(DB)-Struktur ohne Daten. Struktur-Dumps sollten eine gesamte DB mit allen dazugehörenden Elementen (ungeteilt) abbilden. Ein Daten-Dump (Beispiel rechts) enthält alle Befehle zum Einlesen von Daten in eine vorhandene DB-Struktur. Wenn viele Daten vorliegen, oder wenn es aus anderen Gründen sinnvoll ist, wird ein Daten-Dump in kleinere Portionen zerlegt. Nur bei sehr kleinen Lösungen ist es sinnvoll, einen kompletten Dump von Struktur und Daten in einer einzigen (Text)-Datei zu speichern. Die Bedienungs-Oberfläche der Datenbank (meistens Script-Programme für dynamische Webseiten) ist nicht Teil des Dumps und muss unabhängig gesichert werden. |
Dump-Datei personen_struktur.sql
-- Beispiel fuer einen Struktur-Dump
DROP TABLE IF EXISTS `personen`; CREATE TABLE IF NOT EXISTS `personen` ( `p_pk` int(10) unsigned NOT NULL auto_increment, `p_vorname` varchar(20) collate latin1_bin default NULL, `p_zuname` varchar(30) collate latin1_bin default NULL, PRIMARY KEY (`p_index`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin AUTO_INCREMENT=106 ; Dump-Datei personen_daten.sql
-- Beispiel fuer einen Daten-Dump
INSERT INTO `personen` (`p_pk`, `p_vorname`, `p_zuname`) VALUES (101, 'Alfred', 'Ammer'), (102, 'Berta', 'Bieder'), (103, 'Christian', 'Chormeister'), (104, 'Dora', 'Daun'), (105, 'Emil', 'Erpel'); |
SicherheitVon jeder Datenbank sollte ein aktueller Struktur-Dump an einer sicheren Stelle gespeichert sein. Nach jeder Änderung der Struktur müssen diese Sicherungs-Dateien erneuert werden. Daher ist es sinnvoll, das Datum im Datei-Namen zu verankern. Der Platzbedarf ist minimal, die Wichtigkeit sehr hoch, daher ist es sinnvoll, mehrere Kopien an unterschiedlichen Stellen zu speichern.ZeichencodeDie SQL-Anweisungen sollten ausschließlich → ASCII-Code enthalten. Sonderzeichen beliebiger Sprachen werden mit → UTF-8 codiert, allfällig vorhandene Binär-Daten (Blobs) werden ASCII-codiert (z.B. Binhex). Im Text sind Kommentare möglich, diese sollten jedoch ebenfalls nur ASCII-zeichen enthalten.WerkzeugDumps werden normalerweise automatisch erstellt. Jeder SQL-Server und jedes Administrations-Werkzeug (z.B. → phpMyAdmin) bietet dazu Optionen. Das Einlesen gespeicherter Dump-Dateien erfolgt dagegen meist halbautomatisch unter besonderer Aufsicht.Recover-TestEin Dump ist wertlos, wenn sich daraus nicht garantiert (!) die Strukturen und Daten wiedergewinnen lassen. Das muss daher regelmäßig ausprobiert werden - normalerweise nicht auf dem Original-Server sondern auf einem (virtuellen) Test-PC. Ein derartiger Test muss nach jedem wesentlichen Software-Update ausgeführt werden. |
AufwandDaten-Dumps erfordern weit mehr Aufwand als Struktur-Dumps. Für große Daten-Mengen braucht man einige Zeit und viel Speicherplatz.Es ist praktisch, die Größe der erzeugten SQL-Dateien zu begrenzen, z.B. auf 10 MB. Viele kleine Dump-Dateien lassen sich leichter verarbeiten als wenige große. Damit vermeidet man auch Probleme mit der maximalen Laufzeit der dafür meist eingesetzten Script-Programme (PHP, Perl, ..). Daten-Sicherungen sind für Spionage interessant und müssen daher entsprechend sicher aufbewahrt werden: Am besten auf CD/DVD in einem feuersicheren Tresor, am schlechtesten auf einer Festplatte im lokalen Netzwerk (LAN). ZeitpunktEin Dump sollte möglichst nur dann ausgeführt werden, wenn die Datenbank für normale AnwenderInnen stillgelegt ist. Die sicherste Methode dafür ist die Trennung des SQL-Servers vom Netzwerk, in kleinen Betrieben auch die Ausführung bei Nacht bzw. am Wochenende.Nur sehr große Server müssen ständig in Betrieb bleiben, dort muss die Sicherung während des laufenden Betriebs erfolgen. Dumps werden am besten vollautomatisch und regelmäßig ausgeführt, zusätzlich manuell bei einem entsprechenden Anlass. FormatDie Speicherung erfolgt als Klartext (text/plain) in Form kompletter SQL-Anweisungen. Wenn Speicherplatz knapp ist, dann komprimiert man die Text-Dateien in Archive (z.B. *.zip).Es wäre möglich, die Daten in anderen Text-Formaten zu speichern, z.B. mit Tabulator oder Beistrich (CSV) als Trennzeichen. Der Gewinn an Speicherplatz ist jedoch gering, die Einbuße an Brauchbarkeit erheblich. In binärer Form (z.B. die Original-Datanbank-Dateien) ist keine Sicherung sinnvoll, da sich die Daten aus solchen Dateien - wenn überhaupt - nur mit sehr großem Aufwand wiedergewinnen lassen. |
Text-Export |
|
|
In kleinen Betrieben und auf privaten PC gibt es noch zahlreiche PC-Datenbanken älterer DB-Programme, wie z.B. dBase, MS-Access oder FileMaker. Früher oder später erfolgt die Umstellung bzw. Übersiedlung der Daten auf einen Standard SQL-Server. Kaum eines der älteren DB-Programme bietet eine Option zum Speichern von SQL-Dumps, ein Daten-Export ist allerdings immer möglich. |
Eine derartige Umstellung erfordert sehr sorgfältige Vorbereitung, typisch über einen Zeitraum von mehreren Wochen ... Monaten. Es gibt kein allgemeines Rezept für die beste Codierung der Daten zum Zwecke der Übersiedlung. Nachfolgend sind einige Indizien angeführt, nach denen sie eine spezielle Situation beurteilen können. |
Datenbank-(DB)-StrukturKeines der älteren DB-Programme bietet die Möglichkeit eines Struktur-Dumps. Aus diesem Mangel macht man am besten eine Tugend:Länger gelaufene Lösungen sind ohnehin nur selten optimal organisiert. Deshalb ist es sinnvoll, nach der Übersiedlung gleich eine neue, verbesserte Struktur zu verwenden. |
Erstellen sie daher manuell eine komplett neue Struktur auf einem SQL-Server und testen
sie die Lösung ausgiebig - Zuerst mit wenigen typischen Test-Daten, dann mit (evtl.
auch unzulässigen) worst-case-Daten, zuletzt mit einer Kopie der echten Daten. Machen sie bei Erstellung der Struktur keine Kompromisse, sondern versuchen sie eine saubere Lösung nach den Vorgaben der Datenbank-Theorie (Entity Relation Model). Diese Vorgangsweise kann vordergründig kompliziert erscheinen, macht sich jedoch langfristig immer bezahlt. |
DatenDa überholte Software meist keinen SQL-Daten-Dump anbietet, müssen alle Daten als reiner Text exportiert werden. Ein Export in binären Formaten (Access, dBase, Excel, Lotus, Paradox, ... ) kommt normalerweise nicht in Frage.Der größte Teil üblicher Daten kann mit einfachen Mitteln ohne besondere Behandlung in eine SQL-Datenbank übersiedelt werden. Eine genau Analyse (siehe unten) sollte allerdings sicherstellen, dass keine Sonderfälle auftreten. Manche Daten erfordern eine besondere Aufbereitung (Umwandlung): Die Aufbereitung erfolgt am besten noch in der 'alten' Datenbank mit deren Funktionen oder bei MS-Access mit → Basic (VBA). Dazu kann man gut die Zeit bis zur Fertigstellung der SQL-Datenbank nutzen. - Zum Zeitpunkt der Daten-Übernahme ist dann die Aufbereitung auch der neuesten Daten bereits fertig. Der Aufwand zur Verarbeitung oder Beseitigung von Sonderfällen vor dem Export ist bedeutend geringer als nachher. |
Alternativ muss die Aufbereitung der Daten nach ihrem Export erfolgen. Dazu kann man z.B. → Perl-Programme einsetzen, mit deren Hilfe die Verarbeitung von Text besonders einfach ist. Dieser Fall tritt auch dann ein, wenn die 'alte' Lösung bereits beschädigt oder überhaupt nicht mehr arbeitsfähig ist. Wenn die Daten vor dem Export nicht aufbereitet wurden, dann muss die Software eine große Anzahl komplizierter Sonderfälle berücksichtigen. Das macht Übernahme-Programme kompliziert, unüberschaubar und damit anfällig gegen Fehler. Wenn bei der Analyse nicht alle Sonderfälle entdeckt wurden, dann werden manche Daten evtl. fehlerhaft in die SQL-DB übernommen. Solche Fälle sind besonders unangenehm, weil davon meist nur wenige Datensätze betroffen sind und die Fehler lange unentdeckt bleiben. |
|
Aufbereitung, Validierung und Säuberung der Daten
Die Daten der 'alten' DB werden am besten vor der Migration von Karteileichen,
Dubletten und sonstigem Daten-Mist gesäubert.Am besten ist eine komplette Validierung, d.h. alle (!) Daten werden auf sinnvolle oder zulässige Werte überprüft. Das erfordert relativ viel Zeit, jedenfalls aber weniger als eine spätere Reparatur. |
Die folgenden Beispiele sollen nur Anregungen liefern, die Angaben sind nicht immer sinnvoll anwendbar ! |
|
Spezielle Fälle bei der Daten-Aufbereitung
Leer
Eine SQL-Datenbank unterscheidet zwischen dem Wert NULL
(unbestimmt) und einem leeren Text - beide Werte sind zulässig. Sie sollten vor
dem Export sicherstellen, dass solche Werte nicht irrtümlich auftreten.
Meistens ist es besser, solche Werte durch genauere Angaben (z.B. 'Unbekannt',
'Fehler', ..) zu ersetzen.Unbekannt
In der Praxis kommt es relativ oft vor, dass Daten zumindest über eine begrenzte
Zeit unbekannt sind. Das trifft für alle Felder zu, die von Menschen eingegeben
oder geändert werden können. Stellen sie fest, wie der Wert 'Unbekannt'
in jedem dieser Felder codiert sein sollte, und kontrollieren
sie die realen Daten. Vor dem Export sollte jedes der betroffenen Felder eine
eindeutige Aussage enthalten (auch 'Unbekannt' ist eine Aussage).Fehler
In manchen Fällen ist es notwendig, den Wert 'Fehler' in einem Feld
oder einem Datensatz einzutragen. Stellen sie fest, ob und wie das codiert sein
sollte, und kontrollieren sie die realen Daten. Es ist in jedem
Fall besser, Fehler-Werte zu kennzeichnen, als die Daten zu löschen.
Vor dem Export sollte jedes der betroffenen Felder eine eindeutige Aussage enthalten
(auch 'Fehler' ist eine Aussage).Tricks
Im alltäglichen Kampf mit der 'alten' Datenbank haben deren AnwenderInnen
meist einige Tricks entwickelt, um die Software zu überlisten, wenn das notwendig
ist. Sie sollten diese Tricks kennenlernen und darauf reagieren:Am besten ist es, wenn die alten Daten so korrigiert werden, dass die Tricks nicht mehr notwendig sind. Mindestens jedoch muss die neue SQL-DB alle derartigen Fälle sauber berücksichtigt. |
Archiv
Die Migration einer DB-Lösung ist der richtige Zeitpunkt zur Archivierung
nicht mehr benötigter Kartei-Leichen. Veraltete Daten werden
niemals gelöscht, sondern lediglich aus der laufenden
DB in ein Archiv übertragen.Zur Archivierung wird am besten ein eigenen Feld vorgesehen. Je nach den Daten dieses Feldes werden die Daten archiviert oder in die neue Version übernommen. Meist ist es sinnvoll, die Daten des Archiv-Feldes automatisch einzugeben. Man sucht z.B. gezielt nach Kunden, die schon jahrelang nichts gekauft haben, oder nach Artikeln, die schon jahrelang nicht mehr im Sortiment sind. Darüber hinaus können MitarbeiterInnen wertvolle Daten liefern: Jeder kennt den Daten-Mist, der bei der eigenen Arbeit öfters auftritt und kann solche Daten zur Archivierung markieren. Auch offensichtlich fehlerhafte Datensätze werden nicht gelöscht sondern archiviert. Wenn die Tabellen ihrer DB verknüpft sind, dann müssen sie die Archivierung genau überlegen und testen. Bei Entfernung von Kunden- oder Artikel-Daten können/müssen z.B. auch dazugehörende Rechnungen entfernt werden, usw. Die Archiv-Daten könnten einfach in der 'alten' DB bleiben, und werden nicht in die SQL-DB exportiert. Das ist problematisch, denn nach einiger Zeit wird die alte DB-Software auf keinem PC mehr laufen. Besser ist es, die Daten getrennt zu exportieren: Archiv-Daten werden auf Datenträger (CD) kopiert, Live-Daten in die SQL-Lösung übernommen. Die Archivierung kann unabhängig von der Übersiedlung der Lösung auf den SQL-Server bereits lange vorher erfolgen. Das ist vorteilhaft, denn wenn sich im realen Betrieb herausstellt, dass manche archivierte Daten noch gebraucht werden, dann wird das noch vor der Migration korrigiert. |
ZeichensatzÄltere PC-Programme verwenden meist nationale Zeichensätze wie z.B. → ISO-8859 oder sogar firmen-spezifische Zeichensätze wie → CP-1250. Das ist nicht mehr zeitgemäß, beschränkt die Anzahl verwendbarer Zeichen und behindert den Austausch der Daten. Für neue Entwicklungen wird nur der Standard → Unicode verwendet, meist in der Codier-Form → UTF-8.Ältere Daten müssen in UTF-8 umgewandelt werden. Davon sind in deutschen Texten die Zeichen ÄÖÜäöü߀ betroffen. Die Umwandlung erfolgt zwar am besten vor dem Export, die PC-Programme sind dazu jedoch meist ungeeignet. Insbesondere neigen MS-Programme zur unkorrekten Codierung des €-Zeichens. Die Code-Umwandlung wird daher entweder mit einem eigenen Programm (z.B. Perl, PHP) an den exportieren Daten durchgeführt, oder erst nach dem Import in die SQL-Datenbank. ♦ Details zu Zeichen-Codes, Unicode und UTF-8. Binäre Daten(z.B. Bilder) können in manchen Datenbanken gespeichert werden. Sie werden für den Transport am besten in lesbaren Text oder in einzelne binäre Dateien umgewandelt. Überlegen sie bei dieser Gelegenheit, ob die Daten tatsächlich in einer Datenbank am besten aufgehoben sind. Eine Alternative ist die Ablage von Bild-Dateien im Dateisystem und die Speicherung der Pfade zu den Bildern als Texte in der Datenbank.Für die Decodierung / Codierung von Binär-Daten eignet sich z.B. der Binhex-Algorithmus, der auch von einigen Programmiersprachen unterstützt wird. Leere oder unbekannte Werte (NULL)Wenn ein Feld unbekannte Daten enthält, dann wird dieser Fall (NULL) von einem leeren Text ("") oder der Zahl (0) von SQL streng unterschieden. Ältere Software nimmt die Unterschiede nicht so genau. Überlegen sie, ob solche Fälle vorkommen, ob sie zulässig sind, und wie sie für den Export eindeutig zu codieren sind. |
ZahlenGanze Zahlen (z.B. 1, 2, 3, ...) mit oder ohne Vorzeichen stellen kein Problem dar. Sie werden von jeder Software fehlerlos in Texte und zurück in Zahlen umgewandelt, und zwar unabhängig davon, ob führende Nullen oder Leerzeichen entfernt wurden.Gleitkomma-Zahlen (z.B. 3.141592) werden am besten mit der intern verwendeten → Genauigkeit (7 oder 14 Dezimalstellen) in Text umgewandelt. Dezimal-Komma: Alle Programmiersprachen und SQL verwenden Komma-Punkte, nur deutsche Versionen von AnwenderInnen-Programmen verwenden Komma-Beistriche. Das Komma-Zeichen muss in solchen Fällen ausgetauscht werden. Kommerzielle Daten erfordern meist nur die Festlegung auf ein Komma-Zeichen. Die Angabe von 2-5 Dezimalstellen genügt meistens. Technisch-wissenschaftliche Daten erstrecken sich oft über große Werte-Bereiche. In diesen Fällen muss entweder der minmal / maximal vorkommende Zahlenwert analysiert und für die Komma-Stellen berücksichtigt werden, oder man verwendet die Exponential-Darstellung mit entsprechend vielen Nachkomma-Stellen. |
Datum und Zeitwerden von den meisten älteren Programmen in einem internen Format gespeichert. → MS-Access oder → Filemaker verwenden spezielle Formate, die Daten sind daher für die direkte Übernahme in eine SQL-Datenbank ungeeignet.Datum und Zeit werden dazu entweder in Strukturen zerlegt oder in Texte (Strings) codiert. Die Verwendung von Strukturen ist die sicherste Variante: Vor (!) dem Export werden alle Datum-&-Zeit-Werte in 6 ganzzahligen Bestandteile (YYYY, MO, DD, hh, mi, ss) zerlegt, danach wieder zusammengesetzt. Die Verwendung von Texten (Strings) ist einfacher, aber riskanter: Sie müssen unbedingt sicherstellen, dass die Daten eindeutig (!) codiert und decodiert werden. MS-Access exportiert in der deutschen Version ein Datum in der Form dd.mo.yyyy in variabler Länge: Einstellige Tage und Monate verkürzen den exportierten Text. Eine sichere Form der SQL-Eingabe sind Strings fixer Länge nach → ISO-8601 in der Form "YYYY-MO-DD". Sie haben die Wahl, ISO-Strings vor dem Export mit Funktionen der alten Datenbank zu erstellen, oder bei der Verarbeitung aus dem exportierten Datum-Text zu erzeugen. Das Jahr sollte in Texten immer 4stellig angegeben werden. 2stellige Varianten sind zu unsicher. |
Zeitzone und Sommerzeit können Probleme verursachen: Kleine lokale PC-Programme speichern meist ungefragt die jeweilige Lokalzeit. Größere (international verwendete, professionelle) Datenbanken verwenden jedoch ausschließlich die Weltzeit UTC. In diesem Fall muss die Lokalzeit bei einem Transport der Daten umgerechnen (inkl. Sommerzeit !). ♦ Details zu Datum und Zeit (interne Datenformate, ISO-8601, SQL) |
Datum: Text |
|
|
Die große Mehrheit aller in DB gespeicherten Daten sind Texte. Da der gesamte Export als Text erfolgt, haben manche Zeichen als 'Steuerzeichen' besondere Bedeutung, z.B. zur Kennzeichnung der Grenzen von Feldern und Datensätzen. Auf Grund dieser Mehrfach-Bedeutung sind einige Maßnahmen notwendig. |
Zeichen-CodeTatsächlich werden keine Zeichen gespeichert, sondern nur der intern verwendete Code, z.B. Code=65 für das Zeichen A.In einer globalisierten Welt werden unterschiedliche Codes verwendet. Der gleiche Zahlenwert kann daher in einem anderen Staat oder auf einem anderen Betriebssystem ein anderes Zeichen darstellen. Diese Tatsache muss bei der Übersiedlung von Daten berücksichtigt werden. |
Sonder-WerteLeere Text-Felder sowie die Aussagen für "Unbekannt" und "Fehler" werden so behandelt wie bei allen anderen Feldern.Steuer-ZeichenEinige Punkte sorgen für eine sinnvolle Einschränkung der verwendeten Zeichen:Die nicht druckbaren Steuerzeichen sollten nicht vorkommen. Dazu gehören z.B. Glocke (Code=7), Tabulator (Code=9), Zeilen-Umbruch (Code=10 und/oder Code=13), das Lösch-Zeichen (Code=127) und das geschützte Leerzeichen (Code=160). Wenn nicht unbedingt notwendig, werden diese Zeichen aus allen Textfeldern aller Tabellen entfernt oder durch Leerzeichen (Code=32) ersetzt. UmbruchWenn es unbedingt notwendig ist, in einem Feld nicht druckbare Sonderzeichen zu führen, dann erstellt man dafür ein zusätzliches Feld, in dem diese Zeichen maskiert werden. Dieses Feld wird an Stelle der Original-Daten exportiert.Ein Text mit Tab und Umbruch erscheint dann im Export als "Text mit \t Tab und \n Umbruch";
|
TrennzeichenEs wird analysiert, wie oft Kandidaten für Trennzeichen vorkommen ( , ; # \ ' " usw.).Nur wenn gesichert ist, dass ein bestimmtes Zeichen in keinem Textfeld keiner Tabelle vorkommt, kann es beim Export als Trennzeichen verwendet werden. Wenn ein Zeichen nur sehr selten vorkommt, dann kann man es meist durch ein anderes ersetzen und danach als Trennzeichen verwenden. + Wenn das ausgewählte Trennzeichen in manchen Feldern zugelassen werden muss, dann wird es am besten maskiert, so wie für Tabulator und Umbruch beschrieben. + Alle Mehrfach-Leerzeichen werden durch einfache Leerzeichen ersetzt. Das wird so lange durchgeführt, bis keine Treffer mehr auftreten. |
|
Diese Punkte betreffen die verwendeten Zeichensätze: + + Wenn mit der Übersiedlung auch ein Wechsel des Zeichensatzes erfolgt, dann können die Texte bereits in der 'alten' DB umgewandelt werden. Die betroffenen Felder bleiben unverändert, zusätzliche Felder mit den gleichen Texten in einem anderen Code werden (z.B. mit VBA) berechnet und später exportiert. So kann man z.B. Übersiedlungen Apple-EBCDIC-DOS-Windows gut vorbereiten. + In seltenen Fällen enthalten alte Daten Unicode-Sonderzeichen (z.B. slawische, griechische .. Zeichen). Diese Daten werden z.B. von Access ohne Warnung fehlerhaft oder gar nicht als Text exportiert. Die Texte müssen daher vor dem Export in eine Transport-Form umgewandelt werden, z.B. in UTF-8. + Das Euro-€-Zeichen (Unicode 8364) wird von M$-Software gerne mit Code=128 falsch codiert. Wenn das Zeichen in Texten vorkommt, dann wird es am besten maskiert, und später mit dem korrekten Code in die SQL-Datenbank eingegeben. |
|
| Text | |
Datensätze fixer Länge |
|
|
Datensätze fixer (Text)-Länge wurden früher auf Großrechnern
eingesetzt und sind heute kaum noch üblich. Sie müssen für jedes (!) Feld jeder Tabelle die maximal vorkommende Anzahl Zeichen feststellen. Damit wird die fixe Länge des jeweiligen Feldes festgelegt. |
Die fixe Länge eines Datensatzes ergibt sich als Summe der Längen aller
darin enthaltenen Felder. Der große Vorteil dieses Text-Formates ist, dass die darin enthaltenen Texte alle Zeichen enthalten dürfen. Ein großer Nachteil: Beim Transport der Daten macht ein einziges fehlendes oder überschüssiges Zeichen alle folgenden Daten unbrauchbar. Noch schlimmer: Wenn einander 2 (4,6,..) derartige Fehler kompensieren, dann sind alle dazwischen liegenden Daten fehlerhaft, der Fehler kann jedoch unentdeckt bleiben. |
|
Daten dieser Form werden z.B. aus Access so exportiert: (die führenden Nullen der Zahlenfelder werden von Access
nicht exportiert). Unten ein Beispiel für ein Perl-Programm zur Umwandlung einer derartigen Datei in einen SQL-Dump. |
Datei personen_fix.txt
00101Alfred Ammer 00102Berta Bieder 00103Christian Chormeister 00104Dora Daun 00105Emil ErpelDie Darstellung ist nicht ganz korrekt, denn eine derartige Text-Datei kennt keinen Zeilen-Umbruch. Nach einer fixen Anzahl Zeichen/Datensatz folgt unmittelbar der nächste Datensatz. |
Verarbeitung einer Text-Datei mit Datensätzen fixer Länge:Das Beispiel rechts ist in → Perl programmiert, weil diese Programmiersprache zur Verarbeitung von Texten besonders gut geeignet ist. Das Programm verarbeitet eine Text-Datei personen_fix.txt mit folgenden Feldern fixer Länge pro Datensatz: p_index (5 Zeichen) p_vorname (15 Zeichen) p_zuname ( 20 Zeichen) das ergibt 40 Zeichen pro Datensatz. Von der Datei FIX wird in jedem Durchlauf der while-Schleife ein Datensatz $rec der Länge 40 Byte gelesen. Mit einem Regulären Ausdruck ( → RegExp) wird er in 3 Teile der fixen Länge 5,15,20 Zeichen zerlegt und an die Variablen $p_index, $p_vorname und $p_zuname übergeben. Das Hilfsprogramm strip entfernt nachfolgende Leerzeichen und maskiert die beiden Zeichen '\ Zuletzt wird ein SQL-Befehl $sql zusammengesetzt und in die Ausgabe-Datei SQL geschrieben. ♦ Details zur Eingabe und Ausgabe von Dateien mit Perl und zu Regulären Ausdrücken. |
my($rlen,$rec,$sql);
my($p_index,$p_vorname,$p_zuname); open(FIX,"personen_fix.txt"); binmode FIX; open(SQL,"> export_sql.txt"); $rlen = 1; while($rlen) {
$rlen = read(FIX,$rec,40);
}if($rlen==40) {
$rec=~m/(.{5})(.{15})(.{20})/;
}
$p_index=$1+0; $p_vorname=strip($2); $p_zuname=strip($3); $sql="INSERT INTO `personen` "; $sql.="(`p_index`,`p_vorname`,`p_zuname`) "; $sql.="VALUES($p_index,'$p_vorname','$p_zuname');"; print SQL "$sql\n"; close FIX; close SQL; sub strip{
my($t)=@_;
}
$t=~s/\s+$//; $t=~s/'/''/; $t=~s/\\/\\\\/; return $t; |
Datensätze variabler Länge |
|
|
Datensätze variabler Länge sind die heute übliche Form zum
Transport von Texten. Sie ist flexibler und platzsparend, erfordert
jedoch Trennzeichen. Die einzelnen Felder jedes Datensatzes werden durch Feld-Trennzeichen (field-separator) getrennt, die Datensätze durch Satz-Trennzeichen (record-separator, meist ein Zeilen-Umbruch). |
Übliche Feld-Trennzeichen sind Tabulator (ASCII-Code=9), Beistrich
(comma-separated values, CSV, Code=44) oder Strichpunkt (Code=59), übliche
Datensatz-Zeilen-Trennzeichen CR (Code=13), LF (Code=10) oder beide Zeichen zusammen. Analysieren sie die Daten aller Text-Felder aus allen Tabellen: Die von ihnen gewählten Trennzeichen sollten in keinem einzigen der Texte vorkommen ! |
|
Maskierung: Wenn es nicht möglich ist, nach diesem Kriterium ein Trennzeichen zu finden, dann üssen manche Zeichen der Daten 'maskiert' werden. Dabei hält man sich am besten an eine bestehende Regel, z.B. zur Maskierung in C++ oder Javascript. So wird z.B. jeder Zeilen-Umbruch (Zeichen CR und LF) in die Zeichen-Kombination \r\n umgewandelt. |
Alle zur Maskierung verwendeten Zeichen (hier z.B. \ ) müssen selbst maskiert werden, wenn sie im Text vorkommen, z.B. jeder backslash (\) in die Zeichen-Kombination \\ Vor (!) dem Export müssen alle betroffenen Texte in die maskierte Form umgewandelt werden. ♦ Details zur Maskierung von Zeichen. |
|
Text-Kennzeichnung:
ist eine weitere Möglichkeit, bei der Ausgabe auch die verwendeten Trennzeichen
zu exportieren. Jedes Text-Feld wird von Textbegrenzungszeichen eingeschlossen
(meist " "). Das erspart die Maskierung,
kompliziert aber die Verarbeitung.Es ist möglich, dass sowohl Separator-Zeichen als auch Textbegrenzungszeichen in den Daten von Textfeldern vorkommen können. |
Normalfall (Datenbank-Text, darunter exportierter Text):
Das ist ein Text
Export-Steuerzeichen (Datenbank-Text, darunter exportierter Text):
"Das ist ein Text";
Strich;Punkt und "Begrenzung"
In einfachen Fällen ist der Aufwand zur Verarbeitung noch vertretbar.
Sonderfälle (nur Datenbank-Texte) wie"Strich;Punkt und ""Begrenzung"""; ; oder " oder ";" oder "; oder . . erfordern jedoch einen hohen Aufwand - In solchen Fällen sollten sie besser eine Maskierung (s.o.) anwenden. |
|
Daten wie im Beispiel rechts werden z.B. aus Access so exportiert:
Hinweise: Die 1. Zeile kann die Feld-Namen enthalten, leere Felder sind möglich, Text-Felder werden in " " eingeschlossen und können Separator-Zeichen enthalten, . . |
Datei personen_var.txt
"pers_pk";"pers_vorname";"pers_zuname";"pers_Zahl"
101;"Alfred";"Ammer";1,23 102;"Berta";"Bieder";-2,34 103;"Christian";"Chormeister"; 104;"Dora";"Daun";1 105;"Emil";"Erpel";999 |
|
Verarbeitung einer Text-Datei mit Datensätzen variabler Länge:
Auch das Beispiel rechts ist in Perl programmiert. Das Programm verarbeitet eine Text-Datei personen_var.txt mit folgenden Feldern variabler Länge: p_pk, p_vorname, p_zuname
Feld-Trennzeichen ist ein Strichpunkt, Datensatz-Trennzeichen ein Zeilen-Umbruch.Von der Datei VAR wird in jedem Durchlauf der while-Schleife ein Datensatz variabler Länge (= je 1 Zeile) gelesen. Mit Funktion split wird er nach dem Trennzeichen ; in das Array fa zerlegt und an die Variablen $p_pk, $p_vorname und $p_zuname übergeben. Zunächst werden alle Zeichen (" double quote) mit dem Hilfsprogramm strip entfernt, dann wird eine SQL-Anweisung $sql zusammengesetzt und in die Ausgabe-Datei SQL geschrieben. In einer Luxus-Variante könnten sie aus der ersten Zeile die Namen der Felder lesen und direkt zur Formulierung des SQL-Befehls verwenden. ♦ Details zur Eingabe und Ausgabe von Dateien mit Perl und zu Regulären Ausdrücken. |
my($rec,$sql);
my(@fa); my($p_pk,$p_vorname,$p_zuname); open(VAR,"personen_var.txt"); open(SQL,"> sql_dump.txt"); while ($rec=<VAR>){
@fa = split(/;/,$rec);
}$p_pk = strip($fa[0])+0; $p_vorname = strip($fa[1]); $p_zuname = strip($fa[2]); $sql = "INSERT INTO `personen` "; $sql.= "(`p_pk`,`p_vorname`,`p_zuname`) "; $sql.= "VALUES ($p_pk,'$p_vorname','$p_zuname');"; print SQL "$sql\n"; close VAR; close SQL; sub strip{
my($t)=@_;
}
$t=~s/"//g; return $t; |
|