Backslashes aus 600-MB-Datenbank entfernen
Eddie
- datenbank
Hallo allerseits,
ich bin gerade dabei, eine Datenbank von MySQL 4 nach 5 zu überführen - was auch wunderbar klappt hat. Dummerweise sind in der 4er-Version Escape-Fehler drin, die ich früher immer via PHP ausgebügelt hab. Diese Fehler werden auch korrekt in die 5er-Version übernommen, was ja eigentlich erstmal ein gutes Zeichen ist ;-) Es geht also NICHT um den eigentlichen Migration-Prozess!
Die Frage ist vielmehr Folgende: in einigen Spalten (leider nicht in allen) wurden ' und " immer als ' und " gespeichert. Und das würde ich gerne loswerden. Mir stellt sich darum die Frage, in welchem Schritt des folgenden Migrate-Prozesses so ein Eingriff am einfachsten und sichersten ist:
1) direkt noch in der MySQL-4-DB
2) nach Export der kompletten DB (oder wahlweise auch nur der betroff-
enen Tabellen) via
mysqldump -h {HOST} -u {USER} -p{PWD} --no-create-info {DB} > db.sql
Ich könnte also via Suchen und Ersetzen an das Dump-File ran.
Erscheint mir aber irgendwie riskant :-/ Und das kleinste Dumpfile,
das ich erzeugen kann (aus einer einzigen Tabelle) liegt ungepackt
bei 250 MB, es dürfte also recht schwer sein, die Änderungen auf
Gültigkeit zu prüfen.
3) in der fertigen MySQL-5-DB
Welchen Ansatz würdet ihr wählen? Und könnt ihr mir im Fall von 1) oder 3) vielleicht Anregungen geben, ich bin leider kein wirklicher Datenbank-Crack :-/
Danke für eure Hilfe,
Eddie
Ok, ich glaub, ich bin auf einem guten Weg. Manchmal bewirkt das Stellen einer Frage ja bereits erste Erkenntnisse ;-)
Ich habe jetzt Folgendes ausprobiert (unter MySQL5):
UPDATE myTable SET content = REPLACE(content, '\'', ''');
UPDATE myTable SET content = REPLACE(content, '\"', '"');
Das scheint zu funktionieren! Was mich wundert ist, dass die beiden Änderungen nur 5 Sekunden benötigen - auf 70.000 Datensätzen mit 250 Megabytes.
-----------------------------------------------------
Vergesse ich irgendwas Elementares?
Irgendwelche Warnleuchten, die bei Euch anspringen???
-----------------------------------------------------
Bei der ganzen Geschichte darf leider nix schiefgehen :-( Wie halt immer, gell?
Eddie
Tach!
Vergesse ich irgendwas Elementares?
Irgendwelche Warnleuchten, die bei Euch anspringen???
Nein, bei mir nicht. Ob du das im ersten oder dritten Schritt machst, bleibt sich auch gleich. Im Dump würde ich es nicht ändern, denn da sind auch noch die benötigten Backslashes drin, die drinbleiben müssen.
dedlfix.
Hi dedlfix,
danke Dir, beruhigt mich schon :-)
Ich bin jetzt aber doch noch über was gestolpert: laut MySQL-Doku wird bei einer Suche mit LIKE nach einem einzigen \ ein Ausdruck wie %\\% erwartet (also 4-fach), weil da doppelt drüber geparsed wird und dann genau einer übrig bleibt. Und nach so einigen Experimenten scheint bei REPLACE nur eine Verdoppelung nötig zu sein.
Müsste also bei mir wohl heißen:
UPDATE aaa SET content = REPLACE(content, '\\', '\');
UPDATE aaa SET content = REPLACE(content, '\"', '"');
UPDATE aaa SET content = REPLACE(content, "\'", "'");
Eddie
Tach!
Ich bin jetzt aber doch noch über was gestolpert: laut MySQL-Doku wird bei einer Suche mit LIKE nach einem einzigen \ ein Ausdruck wie %\\% erwartet (also 4-fach), weil da doppelt drüber geparsed wird und dann genau einer übrig bleibt.
Die LIKE-Syntax ist quasi eine eigenständige. Und wenn man die in die restliche SQL-Syntax einbindet, kommt dieses doppelte Escapen zustande. Und das auch nur, wenn das Escape-Zeichen nicht geändert wurde. Bei LIKE '~~bla%' ESCAPE '~' braucht man nur eine Verdopplung, um nach einem ~ zu suchen.
Und nach so einigen Experimenten scheint bei REPLACE nur eine Verdoppelung nötig zu sein.
Weil da nur die SQL-Syntax allein auftritt und für diese ein einmaliges Escapen ausreicht. Notierst du aber zum Beispiel das SQL-Statement in PHP in einem String, dann braucht PHP ein Escapen und MySQL noch eins, also auch dann wieder 4 Backslashes.
dedlfix.
Alright! Danke! Hab ich was gelernt heut :-)