sql >> Databáze >  >> RDS >> Mysql

mysql opravit neplatná data

Zdá se, že vaše chybová zpráva přichází z vašeho klienta MySQL, nikoli ze serveru. Nastavení přísného režimu serveru vám tedy nepomůže zobrazit tato data u tohoto klienta.

Zdá se, že máte ve svých datech nějaká data ve stylu 2012-09-31 nebo 2013-02-29. Jsou správně naformátované, ale jinak jsou špatně. Ve verzích MySQL starší než 5.0.2 nebyly tyto správně zachyceny při vstupu do vašich dat. Nyní váš server nastavte na ALLOW_INVALID_DATES neroubuje na nich, ale místo toho je převádí na '0000-00-00'. A klient na ně gackuje.

Prvním krokem k vyčištění je identifikovat problematické řádky. Můžete to zkusit.

Nejprve zapněte ALLOW_INVALID_DATES

Poté spusťte tento dotaz a rozhlédněte se ve své tabulce. Nepoužívejte SELECT *

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

Zkuste ze sady výsledků zjistit, která data jsou nesmysl. Mohou být umístěny na prvním místě v tomto výběrovém prohlášení, ale budete muset trochu makat, abyste je našli.

Dále zjistěte, jak je chcete opravit. Smazat řádky? Změnit datum na 12. 12. 1941 (datum, které žije v hanbě)? Nemůžeme vám říci, co musíte udělat.

Pak je opravte. Pokud existuje pouze jeden nebo dva, opravte je jeden po druhém.

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

nebo

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

Pokud jich jsou tisíce, můžete je hromadně opravit něčím takovým. Nedělejte to však, aniž byste problém nejprve velmi pečlivě prošli na testovacím serveru. Pokud uděláte chybu, smažete svůj stůl.

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

Po dokončení nápravy problémů se vraťte a proveďte SELECT * , abyste se ujistili, že je máte všechny.

Poté deaktivujte ALLOW_INVALID_DATES a nikdy jej znovu neaktivujte.

To by mělo uklidit nepořádek. Všimněte si, že v reálných datech jsou vždy řádky, které v nich nejsou dokonalé.




  1. Hibernate CriteriaBuilder pro spojení více tabulek

  2. Seskupte výsledky dotazů podle měsíce a roku v postgresql

  3. Ukládání obsahu textového souboru do DB:Nesprávná hodnota řetězce:'\xEF\xBB\xBF# W...' pro sloupec 'obsah' na řádku 1

  4. JSON_TYPE() – Získejte typ hodnoty JSON v MySQL