(utf-8?) Probleme mit einer MySQL Abfrage
Marcel
- datenbank
Hallo,
die folgende Abfrage soll zu einem Wort in russischer Sprache die deutsche Übersetzung liefern:
settype($txt, "string");
$result=opendb($db_user, $db_host, $db_pass, $dbname);
mysql_query("SET CHARACTER SET 'utf8'");
$txt = mysql_real_escape_string(stripslashes($txt));
$query="select de, ru from lang where ru like '".$txt."'";
if ((!mysql_select_db($dbname))) {$err=mysql_error(); return(3);}
if ((!$result = mysql_query($query))) {$err=mysql_error(); return(3);}
while(($row = mysql_fetch_array($result)))
{
$txt = $row['de'];
}
Ich bekomme aber leider keine Treffer obwohl die Worte garantiert in der db sind. Wenn ich mir den Query ausgeben lasse, kopiere und in phpMyAdmin im SQL-Fenster eingebe, dann funktioniert die Abfrage perfekt.
Die Abfrage sieht dann so aus:
select de, ru from lang where ru like 'Bce'
Ergebnis sollte "Alle" sein.
Mit anderen Sprachen wie Englisch oder Tschechisch funktioniert es perfekt.
Hat mein Problem was mit dem kyrillischem Zeichensatz zu tun? Kennt sich da jemand aus?
Danke für jeden Tipp.
Grüße Marcel
Sorry, habe ein falschen Beispiel genannt, das funktioniert nämlich:
Die Abfrage sieht dann so aus:
select de, ru from lang where ru like 'Bce'
Ergebnis sollte "Alle" sein.
Z.B. Mit diesem Wort (Мотоцикл) funktioniert es NICHT:
select de, ru from lang where ru like 'Мотоцикл'
Ergebnis solte "Motorrad" sein.
Danke.
Grüße Marcel
Danke, es hat sich erledigt.
Das folgende habe ich noch zusäztlich zu
> mysql_query("SET CHARACTER SET 'utf8'");
eingefügt und damit funktioniert es nun perfekt.
mysql_query("SET NAMES SET 'utf8'");
mysql_query("SET character_set_client = 'utf8'");
mysql_query("SET character_set_connection = 'utf8'");
mysql_query("SET character_set_results = 'utf8'");
Ein schönes Wochenende wünscht euch allen
Marcel
echo $begrüßung;
Das folgende habe ich noch zusäztlich zu
> mysql_query("SET CHARACTER SET 'utf8'");
eingefügt und damit funktioniert es nun perfekt.mysql_query("SET NAMES SET 'utf8'");
Ja, das hatte ich vermutet, dass es am SET CHARACTER SET liegt. Vermutlich steht auch character_set_database nicht auf utf8. Ein SET CHARACTER SET setzt im Gegensatz zu SET NAMES den Wert von character_set_connection auf den von character_set_database. Ein Statement wird nach seinem Empfang von character_set_client auf character_set_connection umkodiert. Dabei gehen prinzipbedingt die UTF-8-Zeichen verloren, die nicht in Latin1 enthalten sind, oder was auch immer der Wert von character_set_connection ist.
mysql_query("SET character_set_client = 'utf8'");
mysql_query("SET character_set_connection = 'utf8'");
mysql_query("SET character_set_results = 'utf8'");
Diese drei kannst du dir sparen, denn die Aufgabe von SET NAMES ist, alle drei auf den übergebenen Wert zu setzen. Auf SET CHARACTER SET kannst du auch verzichten, denn das arbeitet bis auf character_set_connection wie SET NAMES. Siehe MySQL-Handbuch Kapitel Connection Character Sets and Collations.
Außerdem gibt es in neueren Versionen von PHP (abgesehen vom schon länger existierenden mysqli) die Funktion mysql_set_charset(), die zum einen ohne Statement auskommt und zum anderen im Gegensatz zu SET NAMES auch mysql_real_escape_string() richtig arbeiten lässt. (Was aber keine Auswirkungen auf LatinX, ISO-8859-X und UTF-8 hat, da die von mysql_real_escape_string() behandelten Zeichen in diesen Kodierungen eindeutig sind. Eine asiatische Kodierung verwendet die Bytewerte dieser Zeichen auch in Bytekombinationen anderer Zeichen.)
echo "$verabschiedung $name";