sql-datenbank suchanfrage, php und utf-8 problem


greggy80

Mitglied
Hallo,

ich habe ein Problem mit der UTF-8 Kodierung und einer Suchanfrage an eine Datenbank.

Ich habe in der Datenbank UTF-8-Daten abgelegt (Umlaute oder chinesische Zeichen kriegen da "intern" dann so merkwürdige kryptische Zeichen), da ich auch nicht wusste, ob es möglich ist, die Datenbank anzuweisen, UTF-8 zu interpretieren beim schreiben...
Nun starte ich über php eine Suchanfrage:

PHP:
$db->open(); //Erstma unwichtig, wie... der Zugriff funktioniert
    
    $sql = "SELECT id_bilder, bezeichnung FROM bilder WHERE LOWER(bezeichnung) LIKE LOWER('%".utf8_encode("Übersicht")."%') ORDER BY id_bilder"; //uft8_encode verwendet, da Quellcode-Datei in ISO-Schieß-Mich-Tot verfasst wurde. Normalerweise kommt die Suchanfrage von einer Query, die bereits in UTF-8 Kodierung vorliegt.
    
    $res = mysql_query($sql);

    while ($row = mysql_fetch_array($res))
    {
        echo $row["id_bilder"] . " " . $row["bezeichnung"] . "<br/>";
    }
    
    $db->close();
Sinn der Suchanfrage ist, dass die Groß-/Kleinschreibung ignoriert wird.
Leider klappt das ca. gar nicht, denn SQL kriegt es nicht gebacken, die Umlaute oder sonst welche Zeichen zu verkleinern.
Ich hab jetzt schon ne Runde lang überlegt, wie man das Problem umgehen könnte, aber alle Versuche sind gescheitert.

Hat jemand schon mal damit Erfahrung gemacht und ein good practice anzubieten?
 

Gumbo

Erfahrenes Mitglied
Nur wenn die Spalte das BINARY-Attribut hat, wird zwischen Groß- und Kleinschreibung unterschieden. Andernfalls ist „foobar“ gleich „FOOBAR“.
 

greggy80

Mitglied
Könnte man denken, dass es dann funktioniert. Tut es aber nicht. Habe ich das Feld nicht mit BINARY markiert, findet die Anfrage trotzdem nur alle Zeilen, in denen das Wort "Übersicht" vorkommt und nicht "übersicht".
Das Problem liegt meine ich daran, das SQL es nicht hinkriegt, in dem in UTF-8 kodierten String die Buchstaben korrekt zu verkleinern.

Mir fällt auch absolut kein Weg ein, wie man da wieder rauskommt... aber den muss es ja geben, sowas haben andere ja auch schon gelöst :mad:
 

Gumbo

Erfahrenes Mitglied
Sind die Daten in der Datenbank denn bestimmt UTF-8-kodiert? Gib doch mal die Servereinstellungen aus:
Code:
SHOW VARIABLES LIKE "character\_set\_%";
 

greggy80

Mitglied
Wie sich herausgestellt hat, unterstützt mein mysql noch gar nicht das UTF-8 format so richtig... ich kann da zwar utf-8 reinschreiben, wird dann halt nur in kryptische Zeichen umgewandelt... und die Datenbank erkennt jetzt natürlich nicht mehr die Klein- und Großschreibung.
Den Befehl zum Andern des Zeichensatzes - sei es für die ganze Datenbank, Tabellen oder einzelne Spalten oder wie auch immer - unterstützt das mysql einfach nicht. ich lass das jetzt bis morgen vom provider upgraden von 4.0 auf 5.1 und dann schau ich mal weiter. ist halt nur tierisch beschissen... hab n bissl "Angst", dass alle Daten in der Datenbank künftig nicht mehr gelesen werden können. Diese ganzen Zeichenkodierungen sind wahrhaft eine Wissenschaft für sich.
 

greggy80

Mitglied
Ich bin am verzweifeln. Jetzt habe ich schon ein neues MYSQL zur Verfügung und alles über utf-8 laufen, dennoch schreibt der die Daten nicht vernünftig in die Datenbank rein.

Folgendes Beispiel verwende ich, um Daten in die Datenbank zu schreiben und wieder auslesen zu lassen:

PHP:
<?php
    //MYSQL verbinden
    @mysql_connect ("localhost", "root", "") or die ("AH, CRAP!");
    @mysql_connect ("SET NAMES 'utf8'");
    @mysql_connect ("SET CHARACTER SET utf8");
    @mysql_select_db ("test") or die ("AH, CRAP!");
    
    if (isset($_POST["s"]))
    {
        $sql = sprintf("INSERT INTO utf8table (f1) VALUES('%s')", $_POST["p"]);
        mysql_query($sql);
    }
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
    <head>
        <title>Test</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    </head>
    <body>
        <form accept-charset="utf-8" method="post" action="index.php">
            <input type="text" name="p" value=""/>
            <input type="submit" name="s" value="Send"/>
        </form>
        <div>
<?php
    
    
    
    $sql = "SELECT * FROM utf8table WHERE f1 LIKE '%ü%' ORDER BY id DESC";
    $res = mysql_query($sql);
    while ($row = mysql_fetch_array($res))
    {
        echo $row["id"] . ": " . $row["f1"] . "<br/>";    
    }
?>
        </div>
        
    </body>
</html>
Die Datenbank-Kollation ist utf8_general_ci, jede Tabelle und jede Spalte habe ich explizit auch noch mal auf den Wert gesetzt.
Die Quelltextdatei habe ich in UTF-8 abgespeichert, meta-information und accept-charset des Form-Elements ist auch korrekt gesetzt. Selbst in der php.ini, der my.ini und der Apache config habe ich alle Werte auf utf-8 gesetzt...
Kann mir einer sagen, warum das immer noch nicht funktioniert!?
 

Flex

(aka Felix Jacobi)
PHP:
@mysql_connect ("SET NAMES 'utf8'");
@mysql_connect ("SET CHARACTER SET utf8");

Ich denke, das sollte mysql_query heißen und nicht mysql_connect, oder?
 

Forum-Statistiken

Themen
272.355
Beiträge
1.558.606
Mitglieder
187.827
Neuestes Mitglied
kanagawez