MH: MySQL Umlaute

Moin,
ich weiß es gibt schon ganz viele Einträge über diese Thema hier und auch in anderen Foren/auf anderen Seiten. Dennoch stelle ich die Frage, weil ich nicht weiter komme und hoffe das ihr mir helfen könnt :)
Ich hab in einem Projekt Namen in einer Datenbank stehen, die Umlaute enthalten. Soweit alles gut, ich bekomme die Namen richtig ausgegeben und auch wieder eingetragen.
Jetzt ist mir letztens aufgefallen, dass es an einer einzigen Stelle anscheinend Probleme mit den Umlauten gibt. Dadurch bekommt der Nutzer eine Fehler ausgeworfen und kann nicht weiter machen. Ich bin mir sehr sicher, dass das an den Umlauten liegt, da der Fehler nur bei Namen mit den Umlauten auftritt.
Zu meinem generellen Vorgehen mit Umlauten:

  • Die Datenbank hat als Kollation utf8-bin
  • Alle Tabellen haben als Kollation utf8-bin
  • Nachdem eine Verbindung aufgebaut wird führe ich "SET NAMES 'utf8'" aus

Hat jmd. eine Idee woran das liegen kann, dass es trotzdem das Problem mit den Umlauten gibt?
Gruß
MH

  1. Nachdem eine Verbindung aufgebaut wird

    Tja. Es wird wohl von erheblichen Interesse sein wie dieses GENAU geschieht. Du darfst Benutzername und Passwort durch Asterixe ersetzen. Sollte dieses in irgendeiner Art von Terminal- oder Kommandofenster geschehen werde auch darüber Informationen sowie ggf. über die "Umgebung" des Kommandointerpreters, der den MySQL-Client startet, benötigt.

    1. Hi,
      das aufbauen der Verbindung läuft über php:

      $mysqli = mysqli_connect('Host', 'Benutzername', 'Passwort', 'Datenbankname');  
      $mysqli->query("SET NAMES 'utf8'");
      

      Eine Query wenn die Fehlschlägt sieht dann so aus:

      SELECT `Tag1`, `Tag2`
      FROM `Bearbeiter`
      WHERE `Name` = 'R¸ppert'
      

      Das , soll in dem Fall ein ü sein. Da der den Namen so aber nicht findet bekomme ich eine leere "Abfrage"
      Gruß
      MH

      1. $mysqli

        Aha. PHP ist der Client.

        Ist denn der abgefragte Name in UTF-8 notiert?

        Dann wäre noch das hier: mysqli_set_charset($mysqli, "utf8") oder $mysqli->set_charset("utf8")

      2. Eine Query wenn die Fehlschlägt sieht dann so aus:

        SELECT `Tag1`, `Tag2`
        FROM `Bearbeiter`
        WHERE `Name` = 'R¸ppert'
        

        Das , soll in dem Fall ein ü sein.

        Zeig doch mal den Code der diese Query zusammenbaut und woher name kommt. Wenn der Fehler schon in der Query steckt, kann das Problem ja wohl nicht an MySQL liegen. MfG

        1. Moin,
          natürlich! Daran hab ich gar nicht gedacht, dass das dann ja schon vorher falsch übergeben wird.
          Der Name wird mit einem Ajax-Request übergeben, ich hole mir den also mit $_GET['name'].
          Gibt es da irgend ne Möglichkeit das Umlaute richtig übergeben werden? Ansonsten baue ich mir eine "Umlaut-Funktion" die das jeweils umwandelt für die Requests.

          Gruß und danke
          MH

          1. Hallo MH,

            Der Name wird mit einem Ajax-Request übergeben, ich hole mir den also mit $_GET['name'].
            Gibt es da irgend ne Möglichkeit das Umlaute richtig übergeben werden?

            Das HTML-Dokument in UTF-8 abspeichern und allen, die es wissen müssen, mitteilen, dass die Zeichenkodierung UTF-8 ist?

            Matthias

            --
            Rosen sind rot.
            1. Hi,
              ich meinte eigentlich abgesehen davon ;)
              Die Dateien sind alle utf-8 und im HTML-header hab ich mit meta die collation gesetzt:

              <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
              

              Oder ist das falsch?

              Gruß und trotzdem Danke
              MH

              1. Hallo MH,

                Oder ist das falsch?

                https://www.w3.org/International/questions/qa-html-encoding-declarations

                Mithilfe von http://validator.w3.org/i18n-checker/ kannst du dir anzeigen lassen, welche Zeichenkodierung im HTTp-Header gesendet wird.

                Bis demnächst
                Matthias

                --
                Rosen sind rot.
                1. Moin,
                  Laut dem Validator ist die Zeichenkodierung UTF-8, ist also richtig und sollte somit auch richtig übergeben werden.
                  Kann das sonst auch am JavaScript liegen? Oder hat noch jmd. eine andere Idee woran das liegen kann? Ansonsten forme ich die Namen für die Übergabe immer um.

                  Gruß
                  MH

          2. Moin,

            natürlich! Daran hab ich gar nicht gedacht, dass das dann ja schon vorher falsch übergeben wird.
            Der Name wird mit einem Ajax-Request übergeben, ich hole mir den also mit $_GET['name'].

            Zeig mal bitte den JS Code der den ajax Request zusammenbaut. Und guck mal wie ein ü da rausgeht, normalerweise als %C3%BC kodiert. MfG

            1. Hi,
              Der JS-Code:

              function zeigFach(name){
              	if(name == ""){
                	document.getElementById("fachWahl").innerHTML = "";
                } else{
                  if (window.XMLHttpRequest) {
                    // Code für IE7+, Chrome, Opera, Safari
                    xmlhttp = new XMLHttpRequest();
                  } else {
                    // Code für IE6 und IE5
                    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
                  }
                  xmlhttp.onreadystatechange = function() {
                    if (this.readyState == 4 && this.status == 200) {
                      document.getElementById("fachWahl").innerHTML = this.responseText;
                    }
                  };
                  xmlhttp.open("GET","php/getinfo.php?name="+name,true);
                  xmlhttp.send();
                }
              }
              

              Die URL die da rauskaumt sieht so aus: php/getinfo.php?name=Fl%C3%BCgel
              Das ü wird in diesem fall also richtig codiert...

              Gruß
              MH

              1. hi,

                Die URL die da rauskaumt sieht so aus: php/getinfo.php?name=Fl%C3%BCgel
                Das ü wird in diesem fall also richtig codiert...

                So sollte es sein, ja. Aber: Du müsstest das auch sicherstellen, indem Du name=encodeURIComponent(name); aufrufst. Hast Du das noch vor dem Aufruf Deiner Funktion, ich sehe es nämlich nicht.

                Ansonsten sollte das aus $_GET['name'] unzerknittert wieder rauskommen dann wäre die nächste Frage wie es in die Query reinkommt und dabei kaputtgehen kann 😉

                MfG