Christian Schnagl: Konvertieren von MS-ACCESS nach MySQL

Hallo,

ich habe eine MS-ACCESS Datenbank und möchte diese via CGI-Script in eine MySQL-Datenbank einspielen. Das funktioniert auch wunderbar bei Text und Zahlen. Bei MEMO-Feldern allerdings gibts Probleme, sobald eine Zeilenschaltung vorkommt.
Die Access-Datei wurde vorher in eine ASCII-Datei exportiert (delimited mit ;  )
Die Auswirkung ist schon beit folgendem (vereinfachtem) Code sichtbar:

open(LOGFILE, "<test.txt"); @test = <LOGFILE>; close LOGFILE;
  foreach $line (@test)
  {
@f = split(";",$line);
$sql="INSERT INTO testtab VALUES ('$f[0]','$f[1]');
              print "$sql<br><br>";
  }

test.txt:
satz1;memozeile1
memozeile2
satz2;memozeile1
memozeile2

DIE FRAGE:
Gibt es vielleicht eine einfachere Möglichkeit der Konvertierung oder wie kann ich verhindern, daß der Zeilenumbruch (\r\n) nicht als Satzende interpretiert wird? Die Zeilenschaltungen sollen erhalten bleiben !

Danke
Christian

  1. Hi Christian,

    grundsätzlich gibt es zwei einfachere Möglichkeiten:
    1. LOAD DATA INFILE (MySQL Manual 7.15), daß die Aufgabe deines
    Skripts erfüllt, und dem man Optionen für die Trennzeichen und Escape-
    Zeichen übergeben kann. Mit ein wenig probieren sollte es damit gehen,
    notfalls könnte man vorher die Zeilenumbrüche in einem Editor durch
    passende Esacpe-Sequenzen ersetzen, vorausgesetzt, Access verwendet
    verschiedene Zeichen für Zeilenumbruch im Memo-Feld und zwischen
    den Zeilen.
    2. die elegantere Möglichkeit ist MyODBC, ein ODBC-Treiber für
    MySQL (gibt's bei www.tcx.se). Dann kann man die MySQL-Tabellen
    per ODBC in Access einbinden, und die Datenbank einfach per
    Anfügeabfrage übertragen.

    Grüße
    Stephan

      1. die elegantere Möglichkeit ist MyODBC, ein ODBC-Treiber für
        MySQL (gibt's bei www.tcx.se). Dann kann man die MySQL-Tabellen
        per ODBC in Access einbinden, und die Datenbank einfach per
        Anfügeabfrage übertragen.

      Mein CGI benutzt folgende Anweisung, mit der erfolgreich eine Verbindung aufgebaut werden kann:

      $dbh = DBI->connect("DBI:mysql:DB240:rdbms.strato.de","www.schnagl.de","test");
      #www.schnagl.de ist tatsächlich der USERNAME

      Ich habe MyODBC installiert, weiß aber nicht, was ich wo eintragen muß.
      Momentan habe ich folgende Werte verwendet:
      Windows DSN name: DB240
      MySQL host: rdbms.strato.de
      MySQL database name: DB240
      User: www.schnagl.de
      Password: test

      Vielleicht schaffst Du es, eine Verbindung aufzubauen. Mir gelang es nicht!
      ICH BITTE DRINGEND UM HILFE !!

      Außerdem ist der Username längenbegrenzt. Meine zweite Domain (Username) passt hier nicht rein. Lösung? Ich habe keine Rechte auf HOST, USER und DB

      Danke

      Christian

      1. Hallo Christian,

        MySQL bietet die Möglichkeit, remote access, also einen Zugriff von beliebigen
        Servern im Internet, auszuschalten. Strato hat das anscheinend aktiviert, denn
        die ODBC- Fehlermeldung, die ich bekomme (mit Access), ist daß mein Host (d.h. mein
        Einwahlknoten) keine Zugriffsrechte auf den Datenbankserver besitzt.
        Das kann man per Datenbankuser machen, d.h. bei meinem Provider
        kann man sich entscheiden, ob die eigene Datenbank remote
        access erlaubt oder nicht.
        Frag' mal bei Strato nach, ob sie Dir das freischalten können. Laß
        dich nicht mit irgendwelchen Sicherheitsbedenken abwimmeln,
        denn da es per User freigeschaltet wird, ist das Schlimmste, was
        passieren kann, daß einer mit deiner ID und Passwort in deiner
        Datenbank rumpfuscht, und das kann Strato egal sein.
        Anmerkung: wenn's geht, gibt es noch eine einfachere Möglichkeit
        als die in meiner ersten Antwort erwähnte - einfach die Tabelle
        aus Access per ODBC nach MySQL exportieren, dann wird
        die Tabelle mit allen Daten angelegt.
        Anmerkung2: der ODBC-Treiber benötigt grundsätzlich
        ein oder mehrere kombinierte Felder, die als eindeutiger
        Index dienen können.

        Grüße
        Stephan