MySQL Befehl, ich finde den Fehler einfach nicht

NoahsRaven

New Member
hi,

habe mir, um in einer Datenbank Umlautprobleme bei Ortsnamen zu beheben, folgenden Befehl (Auszug) zusammengebaut:

mysql> UPDATE `stack01` SET
-> `Ort`= REPLACE(`Ort`, "Zweibr?n", "Zweibrücken"),
-> `Ort`= REPLACE(`Ort`, "Zw?z", "Zwönitz"),
-> `Ort`= REPLACE(`Ort`, "m?ngen", "Mömlingen"),
-> `Ort`= REPLACE(`Ort`, "m?ngen", "Möglingen");
Query OK, 0 rows affected (0.13 sec)
Rows matched: 30440 Changed: 0 Warnings: 0

funktioniert soweit einwandfrei wie man sieht.

Da z.B.: m?ngen aber nicht immer Mömlingen heist, sondern auch mal Möglingen, habe ich versucht dies mit einer WHERE Klausel PLZ-abhängig zu machen.
Also z.b.:

UPDATE `stack01` SET
`Ort`= REPLACE(`Ort`, "m?ngen", "Möglingen") WHERE `Ort` = 'm?ngen' AND `PLZ` = '71696';

Dies funktioniert auch solange ich nur eine Zeile habe.
Versuche ich wie oben mehrere Zeilen auf einmal zu bearbeiten z.B. durch:

UPDATE `stack01` SET
`Ort`= REPLACE(`Ort`, "Zweibr?n", "Zweibrücken") WHERE `Ort` = 'Zweibr?n' AND `PLZ` = '66482',
`Ort`= REPLACE(`Ort`, "Zw?z", "Zwönitz") WHERE `Ort` = 'Zw?z' AND `PLZ` = '08297',
`Ort`= REPLACE(`Ort`, "m?ngen", "Mömlingen") WHERE `Ort` = 'm?ngen' AND `PLZ` = '63853',
`Ort`= REPLACE(`Ort`, "m?ngen", "Möglingen") WHERE `Ort` = 'm?ngen' AND `PLZ` = '71696';

erhalte ich diesen Fehler:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '`Ort`= REPLACE(`Ort`, "Zw?z", "Zwönitz") WHERE `Ort` = 'Zw?z' AND `PLZ` = '082' at line 2

die WHERE Klausel scheint zu verhindern mehrere Zeilen mit einem mal abarbeiten zu können bzw. mag das/den Komma/Zeilenumbruch nicht oder ich finde den Fehler nicht .

Windows Server 2012 mit MySQL 5.6.

Kann jemand helfen?


MFG Noah's Raven
 

NoahsRaven

New Member
dies bedeutet ich kann es nur in Einzel-Befehlen wie diesen lösen?:


UPDATE `stack01` SET `Ort`= REPLACE(`Ort`, "Zweibr?n", "Zweibrücken") WHERE `PLZ` = "66482";
UPDATE `stack01` SET `Ort`= REPLACE(`Ort`, "Zw?z", "Zwönitz") WHERE `PLZ` = "08297";
UPDATE `stack01` SET `Ort`= REPLACE(`Ort`, "m?ngen", "Mömlingen") WHERE `PLZ` = "63853";
UPDATE `stack01` SET `Ort`= REPLACE(`Ort`, "m?ngen", "Möglingen") WHERE `PLZ` = "71696" ;


MFG Noah's Raven
 

NoahsRaven

New Member
Hi
wirklich zuviel ist mir das nicht.
Ich habe kein Problem mir die hunderten von Befehlszeilen zu generieren (habe ich ja im Prinzip schon) das geht in Excel/StarCalc ratzfatz.

Aber Es gibt
1. einige Hundert PLZ's mit Orten die Umlaute enthalten.
2. Einige PLZ's haben mehrere Orte mit Umlauten.
3. Es gibt Orte mit Umlauten die mehrere PLZ's haben.

und:
Um mir Zeit zu sparen würde ich dann mehrere Befehlszeilen wie oben mit einmal in die MySQL Shell kopieren.
Und wenn der Server dann bei z.b.:
UPDATE `stack01` SET `Ort`= REPLACE(`Ort`, "Zweibr?n", "Zweibrücken") WHERE `PLZ` = "66482";
auf einmal mehrere hundert Datensätze zu korrigieren hat und ich dadurch gleich den nächsten Befehl mit hinten dran ausgelöst habe, steckt das MySQL weg oder bekomme ich dann ein Desaster?

MFG Noah's Raven




PS: habe soeben erfolglos versucht folgendes auf meine Bedürfnisse anzupassen:

https://stackoverflow.com/questions...e-same-column-but-with-multiple-where-clauses

und

https://dba.stackexchange.com/quest...tiple-rows-with-different-values-in-one-query
 

greystone

Member
Hi

Aber Es gibt
1. einige Hundert PLZ's mit Orten die Umlaute enthalten.
2. Einige PLZ's haben mehrere Orte mit Umlauten.
3. Es gibt Orte mit Umlauten die mehrere PLZ's haben.

Sollte ja kein Problem sein.

und:
Um mir Zeit zu sparen würde ich dann mehrere Befehlszeilen wie oben mit einmal in die MySQL Shell kopieren.
Und wenn der Server dann bei z.b.:
UPDATE `stack01` SET `Ort`= REPLACE(`Ort`, "Zweibr?n", "Zweibrücken") WHERE `PLZ` = "66482";
auf einmal mehrere hundert Datensätze zu korrigieren hat und ich dadurch gleich den nächsten Befehl mit hinten dran ausgelöst habe, steckt das MySQL weg oder bekomme ich dann ein Desaster?

Ist kein Problem. Da Du Dich hier auf Terrain mit begrenzter eigener Erfahrung befindest: Mach vor einer potentiell gefährlichen Aktion, die Deine Daten schrotten könnte ein DB-Backup!
 

danton

Debian User
Vielleicht auch eine mögliche Alternative: Alle Datensätze einmal exportieren, in einem Text-Editor die Umlaute umwandeln/ersetzen/wasauchimmer und anschließend wieder importieren.
Falls das keine Option ist würde ich mir wahrscheinlich ein kleines PHP-Script schreiben, mit dem ich die Datensätze auslese, den Wert entsprechend konvertiere und dann wieder zurückschreibe.
 

NoahsRaven

New Member
@danton,

diese Version fällt leider aus.
Da das Fragezeichen alle Umlaute und die folgenden 1-3 Buchstaben ersetzt.
Es gibt also keine ein-eindeutige Zu-Ordnung wie z.b. bei der html-Umlautcodierung.

Dann könnte ich auch in einer der Tabellen der Datenbank direkt arbeiten .
Was ich ja getan habe, daher habe ich ja meine StarCalc-Tabelle mit den Referenzen.
Aber ich will nicht jede Tabelle manuell durcharbeiten.
Ausserdem: wenn mir später sowas wieder unterkommt . . .


Aber ich habe da schon eine Idee.
wenn die klappt poste ich die

MFG Noah's Raven
 

nexus

Well-Known Member
Da das Fragezeichen alle Umlaute und die folgenden 1-3 Buchstaben ersetzt.

Rein aus Neugier:
Wieso tut man sich diesen Streß an, mit derart verstümmelten Daten überhaupt zu arbeiten?
Hast du denn garkeine Möglichkeit, an saubere Datenbestände zu kommen?
 

danton

Debian User
Wenn die PLZ vorhanden ist, würde sich außerdem ja noch anbieten, den Ort darüber einfach zuzuschlüsseln, statt ihn durch Umbenennen zu "erraten". Die Infos könnte man sich z.B. aus der OpenGeoDB holen.
 

GwenDragon

Registered User
Last edited by a moderator:

NoahsRaven

New Member
@nexus
Der Eigentümer(ein Bekannter) der Webseite hatte sich , weil so viele Umstände (wie Meltdown/Spectre, Drohende DSGVO, Abschaltung TLS 1.0)zusammen kamen, vor 2-3 Monaten für ein Relaunch der Webseite auf einem neuen Server/Provider entschieden.
Der externe Dienstleister hat beim Migriren von alte Datenbank-Version(4.x) auf neue wahrscheinlich die Kollation nicht beachtet.
Hat wohl einfach in der DB die ersten Zeilen der Kundendaten (ohne umlaute) gecheckt und sich gedacht 'höhö alles chick'.
Leider hats der Eigentümer erst gemerkt als alter Server schon vom Netz war und Backups auch nicht mehr vorhanden.
Deswegen hat er sich an mich gewendet, so von wegen " hey du machst doch auch sowas"... ne mach ich eben nicht, mein IT-Bereich ist etwas anders gelagert, aber sowas können unbedarfte nicht unterscheiden .

@GwenDragon @danton
im Prinzip habe ich mir ja so eine Liste heruntergeladen
https://www.suche-postleitzahl.org/download_files/public/zuordnung_plz_ort.xls (hab ich zur ODS gemacht)
nur habe ich sehr wenig Kenntnis von PHP, Python, Perl und wüsste nicht wie ich einen Ähnlichkeitsvergleich damit hinbekommen sollte.
Daher habe ich die erste MySQL-Tabelle manuell durch gearbeitet und habe nun die fehlerhaften Schreibweisen in der StarCalc-Tabelle die ich als Vorlage nutze.
Die Befehle sehen jetzt so aus:
UPDATE `stack01` set `Ort`= REPLACE(`Ort`, "Zweibr?n", "Zweibrücken") WHERE `PLZ` = "66482"; DO SLEEP (1);
UPDATE `stack01` set `Ort`= REPLACE(`Ort`, "Zw?z", "Zwönitz") WHERE `PLZ` = "08297"; DO SLEEP (1);
UPDATE `stack01` set `Ort`= REPLACE(`Ort`, "Z?h", "Zürich") WHERE `PLZ` = "8038"; DO SLEEP (1);
UPDATE `stack01` set `Ort`= REPLACE(`Ort`, "Z?g", "Zörbig") WHERE `PLZ` = "06780"; DO SLEEP (1);
UPDATE `stack01` set `Ort`= REPLACE(`Ort`, "Z?ch", "Zülpich") WHERE `PLZ` = "53909"; DO SLEEP (1);


und ich hab die in eine .sql-Datei gespeichert die ich dann als Script in der MySQL Shell ausführe.

Die restlichen paar dutzend die noch übrig sind mach ich per Hand oder bring dem Sohn des Webseitenbetreibers nen neues Hobby bei. :D

MFG Noah's Raven
 

marce

Well-Known Member
Was mir beim Lesen komisch vorkommt: In welchem SQL-Dialekt funktioniert denn ein "?" als Match auf bel. viele Zeichen? Bin ja kein Experte für SQL aber zumindest mein Google sagt da so rein gar nichts dazu...
 

marce

Well-Known Member
... dem widersprechen aber alle vom TE hier geposteten SQLs... - sprich der TE geht da von Dingen aus, die so nicht zutreffen.

... zudem (da man solchen Umlautproblemen ja das eine oder andere mal begegnet) - ein ? in der Darstellung ist sicherlich kein ? im Text, auf welches ein select matchen würde.

Für mich ist der komplette Ansatz fehlerhaft und broken by Design - um solche "FuckUps" zu korrigieren gibt's jede Menge fertige Scripte, welches davon passt oder ob man evtl. doch mit einer Matching-Tabelle oder im schlimmsten Fall mit der Hand am Arm das korrigieren muss kann man nur anhand der konkreten, unverfälschten Daten sagen. Sprich mit nativem Zugang zur DB.

Es geht ja schon direkt los:
hi,

habe mir, um in einer Datenbank Umlautprobleme bei Ortsnamen zu beheben, folgenden Befehl (Auszug) zusammengebaut:

mysql> UPDATE `stack01` SET
-> `Ort`= REPLACE(`Ort`, "Zweibr?n", "Zweibrücken"),
-> `Ort`= REPLACE(`Ort`, "Zw?z", "Zwönitz"),
-> `Ort`= REPLACE(`Ort`, "m?ngen", "Mömlingen"),
-> `Ort`= REPLACE(`Ort`, "m?ngen", "Möglingen");
Query OK, 0 rows affected (0.13 sec)
Rows matched: 30440 Changed: 0 Warnings: 0

funktioniert soweit einwandfrei wie man sieht.
-> ist falsch. Ja - das SQL funktioniert - es wirft keinen Fehler.
Aber alleine das
Query OK, 0 rows affected (0.13 sec)
Rows matched: 30440 Changed: 0 Warnings: 0
sagt, daß da rein gar nichts passiert.

-> Alles zurück auf Anfang und mit sauberer Datenanalyse (auf dem echten Livesystem, ohne Konvertierungs-Probleme von DB -> Export -> Unix -> Windows -> Import, kein Wunder, daß da UTF/ASCII/ISO-Probleme auftauchen) neu anfangen.
 
Last edited by a moderator:

greystone

Member
Ich möchte sagen, dass Character Encodings für mich doch einiges an Voodoo sind, was ich viel zu wenig verstehe.

Ich würde(werde) wahrscheinlich irgendwann nochmal damit anfangen:

http://kunststube.net/encoding/

Ansonsten, wenn die Encodings wirklich irreversibel kaputt sind - Der Autor des Artikels deutet das auch an - dann würde ich mich dem Problem programmatisch annähern:

  1. Erzeuge eine Tabelle mit PLZs und Ortsnamen aus irgend einer Datenquelle aus dem Internet
  2. Führe einen Vergleich der realen Orte/PLZ mit der neuen Orte/PLZ-Tabelle durch
  3. Wenn die Orte übereinstimmen: super
  4. Wenn nur eine geringe Abweichung ist, z. B. 2-4 Buchstaben sind anders, zeige sie an, bzw. ersetze sie.
 
Top