the.star: MySQL 5.0.32: md5 mit insert ignore funktioniert nicht

Hallo zusammen

Ich möchte von DB1.Tabelle1 Infos rausziehen und in DB2.Tabelle1 speichern. Das geht sehr gut mit Insert....Select... nur leider hat er ein Problem mit meinem md5-Befehl. Wie ihr sicher ahnt, geht es um Passwörter und deren Verschlüsselung.

Hier mein (gewünschter) Query, der aber nicht funktioniert:

INSERT INTO DB2.Tabelle1 (id,username,password) SELECT DB1.Tabelle1.id, DB1.Tabelle1.KNID, md5('DB1.Tabelle1.Passwort') FROM DB1.Tabelle1

Ich kriege folgenden Fehler:

Duplicate entry '1' for key 1

DB2.Tabelle1 ist wie folgt aufgebaut:

id int(11)
username varchar(80)
password varchar(32)

Ohne md5() klappt der query:

INSERT INTO DB2.Tabelle1 (id,username,password) SELECT DB1.Tabelle1.id, DB1.Tabelle1.KNID, DB1.Tabelle1.Passwort FROM DB1.Tabelle1

Oder mit IGNORE geht's auch, aber dann habe ich beim Passwort einfach 1000xMal den selben Wert. Die Benutzernamen werden alle korrekt kopiert.

INSERT IGNORE INTO DB2.Tabelle1 (id,username,password) SELECT DB1.Tabelle1.id, DB1.Tabelle1.KNID, md5('DB1.Tabelle1.Passwort') FROM DB1.Tabelle1

Wo könnte das Problem liegen? Besten Dank für Eure Antworten.

Cheers

  1. Hallo,

    Hier mein (gewünschter) Query, der aber nicht funktioniert:

    INSERT INTO DB2.Tabelle1 (id,username,password) SELECT DB1.Tabelle1.id, DB1.Tabelle1.KNID, md5('DB1.Tabelle1.Passwort') FROM DB1.Tabelle1

    Duplicate entry '1' for key 1

    kein Wunder.

    Oder mit IGNORE geht's auch, aber dann habe ich beim Passwort einfach 1000xMal den selben Wert. Die Benutzernamen werden alle korrekt kopiert.

    Wo könnte das Problem liegen? Besten Dank für Eure Antworten.

    Du möchtest den MD5-Hash des jeweiligen Eintrages speichern. Derzeit speicherst Du den MD5-Hash einer stets gleichen Zeichenkette. Wunderst Du Dich, dass dabei stets das gleiche herauskommt.

    Eine Frage zum Schluss: Stehen in DB1.Tabelle1.Passwort Klartextpasswörter?

    Freundliche Grüße

    Vinzenz

    1. Moin!

      INSERT INTO DB2.Tabelle1 (id,username,password) SELECT DB1.Tabelle1.id, DB1.Tabelle1.KNID, md5('DB1.Tabelle1.Passwort') FROM DB1.Tabelle1

      Duplicate entry '1' for key 1

      kein Wunder.

      Oder mit IGNORE geht's auch, aber dann habe ich beim Passwort einfach 1000xMal den selben Wert. Die Benutzernamen werden alle korrekt kopiert.

      Wo könnte das Problem liegen? Besten Dank für Eure Antworten.

      Du möchtest den MD5-Hash des jeweiligen Eintrages speichern. Derzeit speicherst Du den MD5-Hash einer stets gleichen Zeichenkette. Wunderst Du Dich, dass dabei stets das gleiche herauskommt.

      Du hast zwar einen Fehler gefunden, und der Fehler paßt anscheinend auch zur Fehlermeldung, aber insgesamt ergibt es keinen Sinn. Denn wer markiert denn schon ein MD5-Hash-Passwortfeld als UNIQUE? Viel sinnvoller wäre doch, das ID-Feld also UNIQUE bzw. PRIMARY zu markieren.

      Wir sind also noch mindestens einen Schritt mehr von der Lösung entfernt.

      - Sven Rautenberg

      --
      "Love your nation - respect the others."
      1. Hallo zusammen

        Danke vielmals für eure Antworten.
        Inzwischen habe ich die DB2.Tabelle1 so angepasst:

        id int(11), Primary Key, auto_increment
        username varchar(80)
        password varchar(32)

        Wenn ich nun:

        INSERT INTO DB2.Tabelle1 (username,password) SELECT DB1.Tabelle1.KNID, DB1.Tabelle1.Passwort FROM DB1.Tabelle1

        nehme funktioniert das Ganze ohne Fehler. Sobald ich aber die MD5 Funktion wieder einbaue, wird in der Passwortspalte nur immer der erste Wert aus DB1.Tabelle1.Passwort encodiert, wieso? Die Werte aus der Benutzerspalte werden korrekt übernommen.

        INSERT INTO DB2.Tabelle1 (username,password) SELECT DB1.Tabelle1.KNID, md5('DB1.Tabelle1.Passwort') FROM DB1.Tabelle1

        Da das Ganze wohl nicht machbar ist in einem Query, gibt's halt noch ein

        UPDATE DB2.Tabelle1 SET password = MD5(password)

        dazu.

        @Vinzenz: Stehen in DB1.Tabelle1.Passwort Klartextpasswörter? --> Ja, leider. Kommen aus einer individuell entwickelten ERP-Lösung auf Access Basis.

        Cheers

        1. Moin!

          Inzwischen habe ich die DB2.Tabelle1 so angepasst:

          Sobald ich aber die MD5 Funktion wieder einbaue, wird in der Passwortspalte nur immer der erste Wert aus DB1.Tabelle1.Passwort encodiert, wieso?

          Diese Frage hat dir Vinzenz schon beantwortet: Du fügst immer dem MD5-Wert eines konstanten Strings ein.

          Das Passwort aller Accounts lautet: DB1.Tabelle1.Passwort

          Fällt der Groschen?

          UPDATE DB2.Tabelle1 SET password = MD5(password)

          Hier gehts doch auch ohne Fehler.

          - Sven Rautenberg

          --
          "Love your nation - respect the others."
        2. INSERT INTO DB2.Tabelle1 (username,password) SELECT DB1.Tabelle1.KNID, DB1.Tabelle1.Passwort FROM DB1.Tabelle1

          hier hast Du ein Feld: DB1.Tabelle1.Passwort

          nehme funktioniert das Ganze ohne Fehler. Sobald ich aber die MD5 Funktion wieder einbaue, wird in der Passwortspalte nur immer der erste Wert aus DB1.Tabelle1.Passwort encodiert, wieso? Die Werte aus der Benutzerspalte werden korrekt übernommen.

          INSERT INTO DB2.Tabelle1 (username,password) SELECT DB1.Tabelle1.KNID, md5('DB1.Tabelle1.Passwort') FROM DB1.Tabelle1

          Hier hast Du eine Zeichenkette: 'DB1.Tabelle1.Passwort'
          Das ist *kein* Feld. Es ist immer die gleiche Zeichenkette, deren Wert eben genau die Buchstaben 'DB1.Tabelle1.Passwort' sind.
          Spaltennamen gehören *nicht* in einfache Anführungszeichen.

          Da das Ganze wohl nicht machbar ist in einem Query, gibt's halt noch ein

          Es ist machbar :-)

          Svens Frage ist berechtigt. Wieso ein eindeutiger Index auf der Passwortspalte? Das ist keine gute Idee.

          Wird ein Passwort abgelehnt, so weiß man, dass jemand anderes genau dieses Passwort hat. Jetzt muss man nur noch den nicht besonders geheimen Benutzernamen dazu finden.

          Freundliche Grüße

          Vinzenz