Mysql
 sql >> Datenbank >  >> RDS >> Mysql

mysql korrigiert ungültige daten

Es sieht so aus, als ob Ihre Fehlermeldung von Ihrem MySQL-Client und nicht vom Server kommt. Das Einstellen des strengen Servermodus wird Ihnen also nicht dabei helfen, diese Daten mit diesem Client anzuzeigen.

Anscheinend haben Sie in Ihren Daten Daten im Stil von 2012-09-31 oder 2013-02-29. Sie sind korrekt formatiert, aber ansonsten falsch. In MySQL-Versionen vor 5.0.2 wurden diese nicht richtig abgefangen, als sie in Ihre Daten gingen. Stellen Sie nun Ihren Server auf ALLOW_INVALID_DATES ein würgt sie nicht, sondern wandelt sie stattdessen in '0000-00-00' um. Und der Kunde schimpft auf sie.

Ihr erster Schritt, um dies zu bereinigen, besteht darin, die anstößigen Zeilen zu identifizieren. Sie könnten dies versuchen.

Aktivieren Sie zuerst ALLOW_INVALID_DATES

Führen Sie dann diese Abfrage aus, um sich in Ihrer Tabelle umzusehen. Verwenden Sie nicht SELECT *

  SELECT col,col,col,DATE_FORMAT(datecol,'%Y-%m-%d') 
    FROM mytable
   ORDER BY DATE_FORMAT(datecol,'%Y-%m-%d') 

Versuchen Sie aus der Ergebnismenge herauszufinden, welche Daten Müll sind. Sie können in dieser select-Anweisung an erster Stelle stehen, aber Sie müssen ein wenig herumfummeln, um sie zu finden.

Als nächstes finden Sie heraus, wie Sie sie beheben möchten. Zeilen löschen? Ändern Sie das Datum auf 1941-12-07 (das Datum, das in Schande lebt)? Wir können Ihnen hier nicht sagen, was Sie tun müssen.

Dann repariere sie. Wenn es nur einen oder zwei gibt, beheben Sie sie nacheinander.

  UPDATE mytable
     SET datecol='whatever replacement date'
   WHERE id='the id of the offending row.'

oder

  DELETE FROM mytable
        WHERE id='the id of the offending row.'

Wenn es Tausende von ihnen gibt, können Sie sie mit so etwas beheben. Aber tun Sie dies nicht, ohne das Problem zuerst sehr sorgfältig auf einem Testserver durchzuarbeiten. Wenn Sie einen Fehler machen, wird Ihre Tabelle zerstört.

  UPDATE mytable
     SET datecol='whatever replacement date'
   WHERE '0000-00-00' = DATE_FORMAT(datecol,'%Y-%m-%d')

Nachdem Sie Ihre Probleme behoben haben, gehen Sie zurück und führen Sie Ihr SELECT * durch , um sicherzustellen, dass Sie alle erhalten haben.

Deaktivieren Sie dann ALLOW_INVALID_DATES und nie wieder aktivieren.

Das sollte das Durcheinander beseitigen. Beachten Sie, dass reale Daten immer einige Zeilen enthalten, die nicht perfekt sind.