Falsche Umlaute beim Import von txt Datei in Mysql DB
smart
- programmiertechnik
Hallo
Es wird zwar in vielen Threads darüber geschrieben wie man Excel Tabellen in eine Mysql Datenbank bekommt aber leider nirgends wie man das Problem mit den Umlauten löst.
Ich habe eine Adressliste als Excel-Tabelle bekommen und in der kommen natürlich auch massig Umlaute vor.
Diese Liste habe ich dann als txt Datei abgespeichert (dort sind die Umlaute noch vorhanden bzw. lesbar) bei der die Daten mit ; getrennt sind
Bei diesem Import gehen die Umlaute aber entweder verloren oder werden gegen div. Sonderzeichen ersetzt.
Woran liegt das und wie kann man das beheben (ohne manuell jedes Mal wenn sich die Liste ändert die Umlaute mit Suchen/ersetzen umzustellen)?
Was ich bisher probiert habe:
Import der Liste als csv Datei (geht komplett schief)
Seitencodierung des Import-PHP auf utf-8 umstellen
Txt Datei in verschiedenen Codierungsformaten abspeichern (Westeuropäisch, Utf ..)
Hoff jemand von euch kann mir (und sicher auch vielen anderen)
bei diesem Problem helfen.
Danke im Voraus für eure Hilfe/Tipps
Mfg smart
Mit folgendem Code importiere ich diese Datei in die DB:
$liste = "mgliste.txt";
$fp = fopen($liste,"r");
while($zeile = fgetcsv($fp,1500,";")){
$y++;
// Ausgabe der Dateien in eine Tabelle zur Kontrolle bzw Insert in DB
}
fclose($fp);
echo $begrüßung;
Bei diesem Import gehen die Umlaute aber entweder verloren oder werden gegen div. Sonderzeichen ersetzt.
Hoff jemand von euch kann mir (und sicher auch vielen anderen) bei diesem Problem helfen.
Du bist nicht der erste, der dieses Problem hat. Das Archiv kennt bereits einige Antworten. Suchwörter wären: mysql umlaut.
Auch schreibst du nicht, welche MySQL-Version du verwendest. So kann ich nur allgemein auf das Kapitel Character Set Support verweisen.
echo "$verabschiedung $name";
Du bist nicht der erste, der dieses Problem hat. Das Archiv kennt bereits einige Antworten. Suchwörter wären: mysql umlaut.
Schön zu wissen dass man nicht alleine ist ...
werd mich mal mit diesen Suchwörten durch das Suchergebnis kämpfen.
Auch schreibst du nicht, welche MySQL-Version du verwendest.
beim phpAdmin steht 4.0.21 - ist das jetzt gut oder schlecht?
echo $begrüßung;
Auch schreibst du nicht, welche MySQL-Version du verwendest.
beim phpAdmin steht 4.0.21 - ist das jetzt gut oder schlecht?
Wer auch immer phpAdmin ist... wenn du phpMyAdmin meinst, dann wird es sicherlich die Version des Servers sein, die du da gesehen hast. Es gibt auch noch die Client-API, der Programmteil, der beispielsweise im PHP eingebunden ist und sich mit beliebigen Servern unterschiedlicher Versionen verbinden kann. Dessen Versionsnummer zeigt phpinfo() an. Aber die ist weniger interessant.
Wie Sven schon schrieb hat MySQL vor 4.1 zwar keine Probleme, UTF-8-kodierte Zeichen zu speichern, kann diese aber nicht als solche erkennen. Ein Merkmal der UTF-8-Kodierung ist, dass ein Zeichen mit 1 bis 4 Bytes gespeichert wird. Wenn du diese mit einem System anzeigen lässt, das denkt es bekäme Daten in der hierzulande üblichen ISO-8859-1-Kodierung, welche immer 1 Byte pro Zeichen verwendet, dann siehst du die Zeichen, deren Bytewert mit denen der einzelnen UTF-8-Bytes übereinstimmen. Das sieht dann beispielsweise für ein ä so aus: ä
Nehmen wir mal an, deine Daten liegen UTF-8-kodiert vor. Ein Editor, der nicht UTF-8-fähig ist, sollte sie wie beim ä-Beispiel anzeigen. Wenn du Die Datei im Browser öffnest und die Kodierung auf UTF-8 stellt und die Daten dann richtig angezeigt werden, dann kannst du davon ausgehen, dass sie UTF-8-kodiert sind.
Schickst du sie ohne sie zu verändern in die MySQL-Datenbank mit Versionsnummer kleiner als 4.1 werden sie dort zwar aufgenommen, du hast dann aber ein Anzeigeproblem mit Tools, die davon ausgehen, dass sie ISO-8859-1-Daten zu sehen bekommen.
Wenn du sie wieder ausliest, keine Veränderung vornimmst und zum Browser sendest, ihm dabei noch mitteilst, dass er UTF-8-kodierte Daten bekommt, dann hat der auch kein Problem damit.
echo "$verabschiedung $name";
Moin!
Was ich bisher probiert habe:
Import der Liste als csv Datei (geht komplett schief)
Seitencodierung des Import-PHP auf utf-8 umstellen
Txt Datei in verschiedenen Codierungsformaten abspeichern (Westeuropäisch, Utf ..)
Es ist richtig, dass die Zeichencodierung hier das Problem ist.
Es ist aber irrelevant, welche Seitencodierung das Import-PHP-Skript an den Browser ausgibt. Wichtig ist, dass deine Datenbank die richtige Zeichencodierung erfährt - oder dass das auslesende Skript zumindest die gleiche Zeichencodierung benutzt (und an den Browser sendet), wie das schreibende/importierende.
UTF-8 ist ja generell eine gute Lösung für Textspeicherungsprobleme. Das bedeutet dann, dass sämtliche Textein- und -ausgaben auf UTF-8 basieren müssen. MySQL kann übrigens in allen Versionen UTF-8-Texte speichern und wieder ausgeben, auch ohne über diese Tatsache informiert zu sein. Aber ab Version 4.1 kann MySQL UTF-8 auch "verstehen" und erkennt, welche Bytes zusammengehören und ein Zeichen bilden - und kann damit auch angenehmer danach suchen und Stringfunktionen drauf anwenden.
Wenn dein Excel also was anderes als UTF-8 ausgibt, und alle deine PHP-Skripte dem Browser was anderes als UTF-8 als Zeichencodierung angeben (nicht nur das Import-Skript, sondern insbesondere alle, die die DB-Inhalte wieder ausgeben), hast du viele Möglichkeiten, es "zu versauen".
- Sven Rautenberg
Es ist richtig, dass die Zeichencodierung hier das Problem ist.
Danke für den Hinweis. Jetzt hab ich zumindest einen Punkt an dem ich den (Such)hebel ansetzen kann.
Hi,
versuchs doch mal mit phpMyAdmin. Da gibts eine Extra-Funktion zum Import von CSV in MySQL. Mach ich beinahe täglich so ohne Probleme.
versuchs doch mal mit phpMyAdmin. Da gibts eine Extra-Funktion zum Import von CSV in MySQL. Mach ich beinahe täglich so ohne Probleme.
Danke für den Tipp nur leider hab ich auch dass mittlerweile schon erfolglos probiert bekomme dauernd einen Fehler (Befehl wird nicht unterstützt oder die von im selbst erzeugte Syntax passt ihm nicht)
So habs jetzt hinbekommen.
Meinen Lösungsweg möchte ich natürlich nicht vorenthalten:
xls Datei als csv Datei abspeichern
csv Datei in Texteditor in txt Datei konvertieren (Zeichencode Westeuropäisch ISO Latin 1)
txt Datei wie gehabt mit PHP auslesen und in DB schreiben
(DB war bereits auf Zeichencode de-iso-8859-1 eingestellt)
Die Umlaute sind jetzt da und lesbar.
Nochmal danke an alle Poster die mich auch den richtigen Weg gebracht haben ;-)