# MySQL Datenbank bei 1&1 macht Charset-Probleme!



## DataFox (2. März 2008)

Hi Leute

Ich habe bei 1&1 eine MySQL 4.0 Datenbank. Höchst seltsam ist, das ich nirgends erfahren kann auf welchem Charset die DB läuft. Lässt sich auch nicht einstellen! 

Das Problem ist um so seltsamer: Meine Website läuft mit charset=ISO-8859-15. Wenn ich über ein Formular nun Umlaute eingebe und in der DB speichere, sehe ich die Umlaute in phpmyadmin total zerfetzt! Auch auf meiner Website kommen sie zerfetzt raus (seltsame hyroglyphen). Wenn ich in phpmyadmin den Datensatz bearbeite und die Umlaute neu eintippe, und speichere, sehen sie darauf hin richtig aus. Auch auf der Website.

Im Header von PHPmyadmin ist ein charset=iso-8859-1 eingestellt. Aber das hier macht mir ernsthafte Sorgen: Im Seitenquelltext von phpmyadmin kommt ein wildes gemisch von charsets vor:


```
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de" dir="ltr">
<head>
<title>phpMyAdmin 2.6.4-pl3 - phpmyadmin.1und1.de</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<link rel="stylesheet" type="text/css" href="./css/phpmyadmin.css.php?lang=de-iso-8859-1&amp;js_frame=right" />
</head>

<script type="text/javascript">
<!--
    document.writeln('<frameset cols="200,*" rows="*" border="1" frameborder="1" framespacing="1" name="mainFrameset" id="mainFrameset">');
    document.writeln('    <frameset rows="138, *" framespacing="0" frameborder="0" border="0" name="leftFrameset" id="leftFrameset">');
    document.writeln('        <frame src="queryframe.php?lang=de-iso-8859-1&amp;server=1&amp;collation_connection=utf8_unicode_ci&amp;hash=55fc67e75522c3238867f1f26aa8ac941204459898" name="queryframe" frameborder="0" scrolling="no" id="leftQueryframe" />');
    document.writeln('        <frame src="left.php?lang=de-iso-8859-1&amp;server=1&amp;collation_connection=utf8_unicode_ci&amp;hash=55fc67e75522c3238867f1f26aa8ac941204459898" name="nav" frameborder="0" id="leftFrame" />');
    document.writeln('    </frameset>');
    document.writeln('    <frame src="main.php?lang=de-iso-8859-1&amp;server=1&amp;collation_connection=utf8_unicode_ci" name="phpmain55fc67e75522c3238867f1f26aa8ac941204459898" border="0" frameborder="0" style="border-left: 1px solid #000000;" id="rightFrame" />');
    document.writeln('    <noframes>');
    document.writeln('        <body bgcolor="#FFFFFF">');
    document.writeln('            <p>phpMyAdmin arbeitet besser mit einem <b>Frame</b>-fähigen Browser.</p>');
    document.writeln('        </body>');
    document.writeln('    </noframes>');
    document.writeln('</frameset>');
//-->
</script>
```

mal de-iso-8859-1, mal collation_connection=utf8_unicode_ci 

daraus schließe ich, das die DB mit utf8_unicode_ci läuft. 

Was definitiv nicht funktioniert ist, das ich im header meiner website UTF-8 als Charset eintrage. Dann nämlich sind *alle* sonderzeichen und umlaute zerschossen.

Interessant: Wendet man beim Output in PHP utf8_decode() auf die Felder des Datensatzes an, klappt es. Aber erstens wäre es sehr lästig auf jedes Feld immer utf8_decode() anzuwenden und zweitens klappt es nicht bei Dingen, die per Ajax in den Content geholt werden - denn da ist es genau anders herum!

Kann man beim Verbindungsaufbau mit MySQL der DB irgendwie befehlen das alle Rückmeldungen nach charset ISO-8859-15 codiert werden sollen

Habt Ihr eine Idee was man hier tun kann/muss damit es läuft?

Gruß
Laura


----------



## kuddeldaddeldu (3. März 2008)

Hi,



> Kann man beim Verbindungsaufbau mit MySQL der DB irgendwie befehlen das alle Rückmeldungen nach charset ISO-8859-15 codiert werden sollen



SET NAMES 'ISO-8859-15' nach dem Verbindungsaufbau absetzen.



> ```
> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
> ```



Diese Zeile zeigt nicht zwingend die gewünschte Wirkung. Die Browser halten sich eher an das, was der Server im HTTP-Header gesendet hat. Das kannst und solltest Du natürlich mit einem entsprechenden header()-Befehl in PHP selbst steuern... 

Deinen Formularen solltest Du dann noch ein accept-charset Attribut verpassen und dann sollte das Ganze eigentlich funktionieren.

LG


----------



## DataFox (3. März 2008)

Hi, ich habe nun PHP veranlasst folgendes zu tun:


```
ini_set('default_charset', 'UTF-8');
```

damit klappt es, aber ich darf nirgens im Quellcode ein Sonderzeichen wie ü drin haben. Daraus muss &uuml; gemacht werden. Ziemlich lästig... 

SET NAMES 'ISO-8859-15' schluckt meine MySQL 4.0 Datenbank bei 1&1 nicht  scheinbar kann die das nicht.

Gruß
Laura


----------



## kuddeldaddeldu (4. März 2008)

Hi,

hm, eigentlich kann MySQL4.0 kein UTF-8... 
Was brauchst Du denn jetzt eigentlich? UTF-8, ISO-8859-15 oder ISO-8859-1?
Wichtig ist eigentlich nur (außer, dass natürlich alle benötigten Zeichen enthalten sein müssen), dass Du wirklich überall die gleiche Kodierung verwendest. Wenn Du in Deinen PHP-Scripten Umlaute hast, musst Du auch die Scripte in der Kodierung speichern, in der Du den Content auslieferst (mit der header-Funktion). Dann musst Du dafür sorgen, dass Formulardaten in dieser Kodierung übertragen werden und die Datenbankverbindung genauso eingestellt ist.



> SET NAMES 'ISO-8859-15' schluckt meine MySQL 4.0 Datenbank bei 1&1 nicht



Schlägt der Query fehl oder woran machst Du das fest?

LG


----------



## jake (16. Februar 2010)

Danke DataFox !

ini_set('default_charset', 'UTF-8'); 

das war der Bringer!

Ich hatte das Problem, dass meine Seite mit deaktivierem Cache und F5 mal zwischen uft8 und iso geswitcht hat.

Grüße


----------

