Falk: Das Zeichen Ō

Hallo Leute,

Mein php-skrip schreibt reinen Text in eine mysql Datenbank.
Dabei können alle möglichen Zeichen vorkommen, deshalb ist alles komplett auf utf-8 eingestellt.

Das funktionierte bisher auch recht gut. Es gab keine Probleme mit Umlauten undanderen Schriftarten. Es wird alles korrekt gespeichert und auch wieder korrekt ausgegeben.

Jedoch gibt es Probleme wenn z.B. das Zeichen: Ō auftaucht.

Dieses Zeichen wird als ? in der mysql DB gespeichert.
Und bei einem anschließenden Select-Befehl bekomme ich die Warnung:

Warning: mysql_fetch_object(): supplied argument is not a valid
   MySQL result resource in...

Mein Code sieht folgendermaßen aus:

  
   $titel= 'Irgend ein String der auch das Zeichen Ō enthält'  
   $titel= mysql_real_escape_string($titel);  
   $sql = "SELECT ID FROM begriffe WHERE begriff = '$titel'";  
   $ergebnis = mysql_query($sql);  
   while($row = mysql_fetch_object($ergebnis)){  
                 $id= $row->ID;  
   }  

Daraufhin bekomme ich das Warning. Weiß jemand woran das liegt, dass das Ō als ? gespeichert wird und bei einem SELECT Befehl dann gar nichts mehr geht?

  1. Hallo

    Jedoch gibt es Probleme wenn z.B. das Zeichen: Ō auftaucht.

    Dieses Zeichen wird als ? in der mysql DB gespeichert.
    Und bei einem anschließenden Select-Befehl bekomme ich die Warnung:

    Warning: mysql_fetch_object(): supplied argument is not a valid
       MySQL result resource in...

    Mein Code sieht folgendermaßen aus:

    $titel= 'Irgend ein String der auch das Zeichen Ō enthält'
       $titel= mysql_real_escape_string($titel);
       $sql = "SELECT ID FROM begriffe WHERE begriff = '$titel'";
       $ergebnis = mysql_query($sql);
       while($row = mysql_fetch_object($ergebnis)){
                     $id= $row->ID;
       }

    
    > Daraufhin bekomme ich das Warning. Weiß jemand woran das liegt, dass das Ō als ? gespeichert wird und bei einem SELECT Befehl dann gar nichts mehr geht?  
      
    Wie lautet die Ausgabe von [mysql_error](http://www.php.net/mysql_error) und [mysql_errno](http://www.php.net/mysql_errno)?  
      
    Tschö, Auge  
    
    -- 
    Die deutschen Interessen werden am Liechtenstein verteidigt.  
      
    [Veranstaltungsdatenbank Vdb 0.3](http://termindbase.auge8472.de/)
    
  2. echo $begrüßung;

    Das funktionierte bisher auch recht gut. Es gab keine Probleme mit Umlauten undanderen Schriftarten. Es wird alles korrekt gespeichert und auch wieder korrekt ausgegeben.

    Sicher? Auch der phpMyAdmin zeigt alles richtig an?

    Jedoch gibt es Probleme wenn z.B. das Zeichen: Ō auftaucht.
    Dieses Zeichen wird als ? in der mysql DB gespeichert.

    Damit hast du ein Zeichen, das außerhalb von ISO-8859-1/Windows-1252/Latin1 liegt. Wenn aus einem Zeichen ein ? wird, findet unter Garantie eine Umkodierung statt, bei der dieses Zeichen in der Zielkodierung nicht dargestellt werden kann, beispielsweise von UTF-8 nach ISO-8859-1.

    Und bei einem anschließenden Select-Befehl bekomme ich die Warnung:
       Warning: mysql_fetch_object(): supplied argument is not a valid

    Diesen Fehler bekommst du nicht beim Select sondern beim nachfolgenden Fetch. Du hast ignoriert, dass mysql_query() über seinen Rückgabewert einen Fehlerzustand bekanntgab, statt einer fetchbaren Ressourcenkennung. Werte stets die Rückgabeergebnisse aus, bevor du damit weiterarbeitest. Den eigentlichen Fehler bekommst du, wenn der Rückgabewert false ist, über mysql_error().

    Weiß jemand woran das liegt, dass das Ō als ? gespeichert wird

    Es sind mindestens zwei Dinge zu beachten, wenn man mit Daten umgeht.

    1. Das verarbeitende System muss mit den Daten umgehen können.
    2. Die Kommunikation zweier Geräte muss aufeinander abgestimmt sein.

    Es ist im Prinzip nicht (zweifelsfrei) möglich, auf Empfängerseite zu erraten, welche Kodierung der Sender verwendet hat.

    Im Falle MySQL müssen für 1) die Felder (jedes einzeln!) der Tabelle mit einer passenden Kodierung konfiguriert sein (Kodierung und Kollation - wobei die Kollation nicht für das Speichern wichtig ist, aber immer zusammen mit der Kodierung gesetzt wird).
    Für 2) muss man MySQL nach jedem Verbindungsaufbau mitteilen, welche Kodierung man zu verwenden gedenkt. Dafür gibt es die PHP-Funktion mysql_set_charset() oder als Alternative ein SET NAMES-Statement.

    und bei einem SELECT Befehl dann gar nichts mehr geht?

    Das verrät dir die Auswertung des eigentlichen Fehlers.

    echo "$verabschiedung $name";

  3. Hallo dedlfix, Auge

    Das Problem ist jetzt behoben.

    Hab mir
    echo mysql_errno() . ": " . mysql_error() . "\n";
    anzeigen lassen.

    Und da kam prompt:
    1267: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='

    Da
    header("Content-type: text/xml; charset=utf-8");
    und
    SET NAMES utf8"
    bereits gesetzt waren konnte es ja auch nur noch die Kollation der einzelnen Spalten sein. Die hab ich dann sogleich von latin1_swedish_ci auf utf8_general_ci eingestellt.

    Mir war nicht bewusst das die Kollation auch angepasst sein muss. ABer jetzt ist mir klar das man gür den Vergleich mit = natürlich auf beiden seiten den selben Zeichensatz benötigt.

    Vielen Dank an euch beide, hat mir schnell geholfen + eure Beiträge haben sich gut ergänzt :)

    @dedlfix: Danke für die ausführliche Hilfe

    Machts gut