Algorithmus zur Korrigierung von Umlauten

tklustig

Erfahrenes Mitglied
Hallo Leute ,habe soeben über CSV-Dateien >100.000 Records in eine MySQL-Datenbank importiert. Leider werden sämtliche Umlaute durch ein Fragezeichen dargestellt. Folgende Funktion ersetzt mir das Fragezeigen
SQL:
UPDATE tabellenname SET spalte1 = REPLACE( spalte1, "suchstring", "ersetzenstring" ) ;
Allerdings reicht das bei weitem nicht, da das Deutsche bekanntlich mehrere Umlaute kennt, von dem ß will ich erst gar nüscht reden. Kennt jemand eine prozedurale Funktion, die dieses Problem mitunter bereits gelöst hat. Wenn nicht, welcher Algorithmus käme in Frage(Struktogramm erwünscht)?
Will das Problem auf DBMS-Ebene lösen,also ohne Einsatz von PHP o.ä.
Happy Coding
 
Zuletzt bearbeitet:
Hi

die Umlaute sind nicht das einzige Problem, es gibt in Unicode noch mehr als hunderttausend andere Zeichen mit mehr als einem Byte in UTF8... wirklich sicher zu sein dass keine deiner Records irgendeins davon verwendet wird wohl nicht gehen.

Zuerst ein mal ein paar nötige Infos (Falls es nicht klar ist, wo man was sieht, bitte einfach sagen):
Ist die CSV-Datei noch verfügbar? Welches Charset/Encoding hat sie?
Wie viel Spalten gibt es, die für Text gedacht sind (egal welcher der möglichen MySQL-Typen)? Pro Spalte, was ist als Charset und Kollation eingestellt?
Sind die CSV-Daten die einzigen Daten in den relevanten DB-Tabellen? Bzw. falls der Import rückgängig gemacht werden soll, kannst du einfach eine Tabelle leeren, oder ID x bis y löschen, oder wird das umständlicher?
 
Quelle der Daten ist eine ACCESS Datenbank. Die Records der Tabelle exportiere ich in eine CSV-Datei durch die Exportoption von ACCESS. Der Export erfolgt mit den richtigen Zeichen(ä,ö,ü,ß statt ?). Die Datenbank habe ich gemäß folgendem Script auf den korrekten Zeichensatz umgestellt. Der Import via phpmyadmin soll ich durch den Zeichensatz
utf-8 durchführen. Vielleicht wäre es besser,den Zeichensatz windows-1252 zu verwenden. Was meint ihr?
Werde den Import der CSV-Datei(dort sind die Records nämlich korrekt dargestellt) über die Konsole durchführen, vielleicht klappt es ja dann?
Basierend auf diesen Infos sind weitere Maßnahmen, die einen korrekten Import ermöglichen, willkommen:eek:
PHP:
<?php
$user = "root";
$pw = "";
$databasetyp = "mysql";
$hostname = "localhost";
$databasename = "ba";

try{
//instanziere ein Objekt der Klasse PDO gemäß den Parametern des Konstruktors
    $dbh = new PDO("$databasetyp:host=$hostname;dbname=$databasename;charset=utf8", $user, $pw, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    echo"<h3>MySQL-Datenbank wurde soeben initialisiert...</h3>";
    echo"<p><font size='5'>Bitte ganz nach unten scrollen um die Zusammenfassung zu lesen!</font>";
}
catch (PDOException $e){
    print "<h3><center>Error!: " . $e -> getMessage() . "<br></h3></center>";
    echo"<p><font size='5'>ERROR!!!Keine Verbindung zur Datenbank möglich. Bitte überprüfen Sie folgende Verbindungsparameter:<br>
    Benutzer:$user<br>Datenbanktypus:$databasetyp<br>Server:$hostname<br>Datenbank:$databasename<br>Passwort:";
    if($pw=="") echo "keines</p>"; else echo $pw."</p>";
    die();
}

$sql0="ALTER DATABASE $databasename DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci";
$dbh->query($sql0);
$sql1="SET FOREIGN_KEY_CHECKS=0"; //setzt die referenzielle Integrität außer Kraft
$dbh->query($sql1);

$sql="SHOW TABLES";
$treffer = $dbh->query($sql);
$x=0;
foreach ($treffer as $daten) {     
    echo"<p><font color='red'>". $daten[0]."</font> wurde soeben auf den richtigen Zeichensatz umgestellt<br>";
    $sql2="ALTER TABLE $daten[0] CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci";
$dbh->query($sql2);
$x++;   
}
$sql3="SET FOREIGN_KEY_CHECKS=1"; //reaktiviert die referenzielle Integrität
$dbh->query($sql3);
echo"<p><font size='5'><font color='blue'>Die Datenbank $databasename wurde auf den richtigen Zeichenssatz umgestellt<br>";
echo"<p>Es wurden insgesamt $x Tabellen auf den deutschen Zeichensatz utf8_general_ci umgestellt. Umlaute sind jetzt kein Problem mehr!</font>";
?>
 
Der Export erfolgt mit den richtigen Zeichen(ä,ö,ü,ß statt ?).
Natürlich, aber in welchem Zeichensatz (also die CSV-Datei als Ergebnis)?
Das Problem hier ist nicht, dass Access deine Umlaute (und andere Sonderzeichen) kaputtmacht, sondern dass es keine einheitliche Regel gibt, mit welchen Byte(s) solche Sonderzeichen zu speichern sind (oder auch "alle" Zeichen ... nur sind bei ABC nicht so viel Möglichkeiten gebräuchlich, also weniger Chance eine andere zu erwischen). Irgendwo zwischen Access und deiner MysqlDB ist da ein Punkt, wo du Daten in einer Art hast und das Programm etc. aber Daten in einer anderen erwartet.

Auch die anderen Fragen (gibt es schon andere Daten in der Ziel-DB usw.) sind noch unbeantwortet...

Vielleicht wäre es besser,den Zeichensatz windows-1252 zu verwenden.
Nein (nein, nein, nein, nein, ..)
 
Zuletzt bearbeitet:
Problem hat sich erledigt. Schuld war phpmyadmin:confused:
Nachdem ich auf der Konsole folgenden Befehl ausgeführt hatte, waren die 29.000 Datensätze innerhalb einer(!) Sekunde mit den korrekten Zeichen importiert. phpmyadmin hatte dafür über 25 Minuten gebraucht, mit den falschen Zeichen, wohlgemerkt
Code:
SET root=E:
SET pfad="E:\\xampp\\mysql\\bin"
SET username="root"
SET host="localhost"
%root%
cd %pfad%
mysql -u %username% -h %host%
und in MySQL dann folgenden Importbefehl:
SQL:
LOAD DATA LOCAL INFILE 'C:\\Dumps\\ba_berufe.csv'
INTO TABLE ba_berufe
FIELDS TERMINATED BY ';'
;
 
Zuletzt bearbeitet:
Naja ... wie man es sieht. Ich empfehle trotzdem, dich etwas mehr mit dem Thema vertraut zu machen - PhpmyAdmin funktioniert schon wenn man es nur richtig bedient.

Und deine Konsolenbefehle importieren übrigens gar nichts (wie auch, wenn von Access oder CSV-Dateien nicht mal was vorkommt)
 
Zurück