# Euro-Zeichen in MySQL trotz utf8_decode() nicht darstellbar; Umlaute funktionieren



## Thomas D (1. Februar 2008)

Hallo!

Ich speichere Daten in meine MySQL-Datenbank mittels PHP. Zuvor decodiere ich noch UTF8 damit Sonderzeichen wie Ä, Ü, ß, ... richtig dargestellt werden. Dies funktioniert auch alles einwandfrei, außer beim Euro-Zeichen (€), welches in der Datenbank mit einem Fragezeichen (?) dargestellt wird.

Als Kollation in MySQL habe ich sowohl UTF8_GENERAL_CI, als auch LATIN1_SWEDISH_CI ausgewählt. Ist jetzt zwar nur 'ne Kleinigkeit, da das Euro-Zeichen erst mal nicht in der Datenbank gespeichert werden muss, aber um einer schönen Lösung Willen, hätte ich schon gerne gewusst, warum dies nicht funktioniert ...

MfG, Thomas D.


----------



## Gumbo (1. Februar 2008)

Das Euro-Zeichen ist auch nicht im ISO-8859-1-Zeichensatz („Latin1“) enthalten.


----------



## Thomas D (1. Februar 2008)

Thomas D hat gesagt.:


> Als Kollation in MySQL habe ich *sowohl UTF8_GENERAL_CI*, als auch LATIN1_SWEDISH_CI ausgewählt.



Ich hab's eh mit UTF8 probiert - s. obiger Eintrag. Nur ist es leider nicht gegangen ...


----------



## kuddeldaddeldu (1. Februar 2008)

Hi,

Kollation != Kodierung 

Was passiert, wenn Du nach dem Verbingungsaufbau SET NAMES 'UTF-8' machst? Und dann die Daten natürlich nicht mehr UTF-8-dekodierst...

LG


----------



## MonGol1992 (1. Februar 2008)

Nabend,

hast du schonmal ausprobiert, ob es funktioniert, wenn du die Zeichen ganz "normal", sprich ohne utf8_decode(), in die DB einträgst und erst später beim Auslesen der Daten utf8_encode() benutzt?

MfG,
Marcel


----------



## Thomas D (1. Februar 2008)

MonGol1992 hat gesagt.:


> hast du schonmal ausprobiert, ob es funktioniert, wenn du die Zeichen ganz "normal", sprich ohne utf8_decode(), in die DB einträgst und erst später beim Auslesen der Daten utf8_encode() benutzt?



Ich benutze schon jetzt erst später beim Auslesen ut8_encode(). Wenn ich Daten jedoch nicht UTF8-dekodiere, dann werden auch die Umlaute, das Scharfe S, ... falsch dargestellt. Mit der Konvertierung funktioniert eh alles - außer eben halt das Euro-Zeichen.


----------



## Gumbo (1. Februar 2008)

Die utf8_decode()-Funktion konvertiert eine UTF-8-Zeichenkette (also Unicode-Zeichen) in eine ISO-8859-1-Zeichenkette. Da der ISO-8859-1- und der Unicode-Zeichensatz jedoch nicht dieselbe Zeichenmenge haben (ISO 8859-1 enthält ganze 256 Zeichen, Unicode hingegen fast 100.000), ist es klar, dass „ein paar“ Zeichen unter den Tisch fallen. Und dazu gehört auch das Euro-Zeichen.


----------



## kuddeldaddeldu (1. Februar 2008)

Hi,

warum schreibst Du die Daten nicht gleich UTF-8-kodiert, so wie Du sie ja offensichtlich bekommst, in die Datenbank? Dann kannst Du Dir das ganze Umkodieren sparen. Gumbo hat nunaml recht. Das Euro-Zeichen ist in ISO-8859-1 halt nicht drin.

LG


----------



## Thomas D (1. Februar 2008)

kuddeldaddeldu hat gesagt.:


> Hi,
> 
> warum schreibst Du die Daten nicht gleich UTF-8-kodiert, so wie Du sie ja offensichtlich bekommst, in die Datenbank? Dann kannst Du Dir das ganze Umkodieren sparen. Gumbo hat nunaml recht. Das Euro-Zeichen ist in ISO-8859-1 halt nicht drin.
> 
> LG



Hallo!

Das wollte ich ja auch usprünglich, doch wenn ich das uncodiert sende (Probeausgabe des SELECT-Statements ist absolut korrekt), dann wird in der Datenbank bei 'ßßß' beispielsweise folgendes gespeichert: 'ÃŸÃŸÃŸ' (soeben getestet). Und das sowohl bei Spalten, die ich auf LATIN eingestellt habe, als auch bei UTF8_GENERAL_CI. Persönlich würde ich mir auch viel lieber die ganze Herumcodiererrei sparen, doch ich frage mich, warum das in MySQL nicht korrekt funktioniert  ...

MfG, Thomas D.


----------



## kuddeldaddeldu (1. Februar 2008)

Hi,

welche MySQL-Version hast Du?
Wenn Du UTF-8-kodierte Daten über eine auf UTF-8 eingestellte Verbindung in die DB schreibst und die genauso wieder ausliest, sollte das auch funktionieren. Irgendwo hakt's da bei Dir noch...
Reden wir hier eigentlich über eigene PHP-Scripte? Dann könnte ein wenig Code nicht schaden. 

LG


----------



## Thomas D (1. Februar 2008)

Hallo!

Mir ist jetzt beim erneuten Ändern der Spalten-Kollationen etwas aufgefallen: In phpMyAdmin wird neben den Spalten überall 'utf8_general_ci' angezeigt. Unter dem Punkt 'Zeilenstatistik'  (neben 'Speicherverbrauch') darunter wird allerdings als Kollation weiterhin 'latin1_swedish_ci' angezeigt. Könnte es sein, dass es daran hapert und wie stelle ich das um ...

Auf der Startseite vom phpMyAdmin steht übrigens folgendes:



> Server Version: 4.1.20
> Protokoll-Version: 10
> ...
> MySQL-Zeichensatz: UTF-8 Unicode (utf8)
> Zeichensatz / Kollation der MySQL-Verbindung: utf8_unicode_ci



Müsste also auch passen ...

MfG, Thomas D.


----------



## ravenstorm (20. Februar 2012)

Habe dasselbe Problem. Einer eine Lösung?


----------



## Napofis (20. Februar 2012)

Etwas mehr Infos wären Hilfreich.

zB:

Was ist der genaue Fehler
Welchen Zeichensatz verwendest du und vor allem wo (Datenbank, Verbindung, Skript)
Wo tritt der Fehler auf, beim der Abfrage oder bei der Speicherung?
Welches Administrationstool verwendest du?
and so on ...


----------



## Raisch (20. Februar 2012)

Thomas D hat gesagt.:


> Mir ist jetzt beim erneuten Ändern der Spalten-Kollationen etwas aufgefallen: In phpMyAdmin wird neben den Spalten überall 'utf8_general_ci' angezeigt. Unter dem Punkt 'Zeilenstatistik'  (neben 'Speicherverbrauch') darunter wird allerdings als Kollation weiterhin 'latin1_swedish_ci' angezeigt.


Die Kollation deiner Tabelle (_nicht der einzelnen Spalten_) steht demnach noch auf _latin1_swedish_ci_. Das kannst Du ändern, indem Du in der Tabellenansicht, in phpMyAdmin, auf _Operationen_ klickst und die Kollation dort auf _utf8_general_ci_ stellst.

Vermutlich steht auch die Kollation deiner Datenbank auf _latin1_swedish_ci_ oder _latin1_general_ci_. Ändern kannst Du das in der Datenbankansicht, dort ebenfalls bei _Operationen_.



Thomas D hat gesagt.:


> Könnte es sein, dass es daran hapert und wie stelle ich das um ...


Meiner Meinung nach nicht. Ich vermute es liegt daran, dass das Charset der HTML-Seite nicht UTF-8 ist.

In HTML/XHTML:

```
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
```
In HTML 5:

```
<meta charset="utf-8">
```

Gruß


----------



## Parantatatam (20. Februar 2012)

Also generell kann man das Problem damit lösen, dass man einfach alles als UTF-8 behandelt. Das heißt, dass die Verbindung mit UTF-8 verwendet wird, die Daten in der Datenbank in UTF-8 gespeichert werden und in HTML – wie Raisch schon schrieb – als UTF-8 ausgegeben werden.


----------



## Raisch (20. Februar 2012)

Oh man, gar nicht mitbekommen, dass der Thread von 2008 ist... ravenstorm hat ihn nur wieder rausgekramt.


----------



## ravenstorm (22. Februar 2012)

Ich lasse nun alle Eingaben in HTML-Codes umwandeln und so in die Datenbank eintragen. Bei der Ausgabe aus der Datenbank wird dieses dann wieder decoded.


```
$search = array('&','€','"',"'",'<','>','?','?','?','?',
				'?','?','?','?','?','?','?','?','?','?',
				'?','?','?','?','?','?','?','?','?','?','?','?',
				'?','?','?','?','?','?','?','?','?','?','?','?',
				'?','?','?','?','?','?','?','?','?','?','?','?',
				'?','?','?','?','?','?','?','?','?','?','?','?','?','?',
				'Ä','ä','Ë','ë','Ï','ï','Ö','ö','Ü','ü',
				'Ÿ','ÿ','ß','©','®','™','«','»','•',
				'·','¨','…','¡','¿','¦','§','º','ª','¯',
				'¶','†','‡','°','¢','£','¤','¥','ƒ','±',
				'÷','×','v','?','¹','²','³','´','¸','‰',
				'µ','¬','½','¼','¾','À','Á','Â','Ã','Å',
				'Æ','Ç','È','É','Ê','Ì','Í','Î','Ð','Ñ',
				'Ò','Ó','Ô','Õ','Ø','Œ','Ù','Ú','Û','Ý',
				'Þ','à','á','â','ã','å','æ','ç','è','é',
				'ê','ì','í','î','ð','ñ','ò','ó','ô','õ',
				'ø','œ','ù','ú','û','ý','þ','Š','š','?',
				'?','G','?','?','?','?','T','?','?','?',
				'?','?','?','?','?','?','S','?','?','F',
				'?','?','O','a','ß','?','d','e','?','?',
				'?','?','?','?','µ','?','?','?','p','?',
				'?','s','t','?','f','?','?','?',
				'I','i','G','g','S','s','£');
				$replace = array('&amp;','&euro;','&quot;','&apos;','&lt;','&gt;','?','?','?','?',
				'?','?','?','?','?','?','?','?','?','?',
				'?','?','?','?','?','?','?','?','?','?','?','?',
				'?','?','?','?','?','?','?','?','?','?','?','?',
				'?','?','?','?','?','?','?','?','?','?','?','?',
				'?','?','?','?','?','?','?','?','?','?','?','?','?','?',
				'&Auml;','&auml;','&Euml;','&euml;','&Iuml;','&iuml;','&Ouml;','&ouml;','&Uuml;','&uuml;',
				'&Yuml;','&yuml;','&szlig;','&copy;','&reg;','&trade;','&laquo;','&raquo;','&bull;',
				'&middot;','&uml;','&hellip;','&iexcl;','&iquest;','&brvbar;','&sect;','&ordm;','&ordf;','&macr;',
				'&para;','&dagger;','&Dagger;','&deg;','&cent;','&pound;','&curren;','&yen;','&fnof;','&plusmn;',
				'&divide;','&times;','&radic;','&int;','&sup1;','&sup2;','&sup3;','&acute;','&cedil;','&permill;',
				'&micro;','&not;','&frac12;','&frac14;','&frac34;','&Agrave;','&Aacute;','&Acirc;','&Atilde;','&Aring;',
				'&AElig;','&Ccedil;','&Egrave;','&Eacute;','&Ecirc;','&Igrave;','&Iacute;','&Icirc;','&ETH;','&Ntilde;',
				'&Ograve;','&Oacute;','&Ocirc;','&Otilde;','&Oslash;','&OElig;','&Ugrave;','&Uacute;','&Ucirc;','&Yacute;',
				'&THORN;','&agrave;','&aacute;','&acirc;','&atilde;','&aring;','&aelig;','&ccedil;','&egrave;','&eacute;',
				'&ecirc;','&igrave;','&iacute;','&icirc;','&eth;','&ntilde;','&ograve;','&oacute;','&ocirc;','&otilde;',
				'&oslash;','&oelig;','&ugrave;','&uacute;','&ucirc;','&yacute;','&thorn;','&Scaron;','&scaron;','&Alpha;',
				'&Beta;','&Gamma;','&Delta;','&Epsilon;','&Zeta;','&Eta;','&Theta;','&Iota;','&Kappa;','&Lambda;',
				'&Mu;','&Nu;','&Xi;','&Omicron;','&Pi;','&Rho;','&Sigma;','&Tau;','&Upsilon;','&Phi;',
				'&Chi;','&Psi;','&Omega;','&alpha;','&beta;','&gamma;','&delta;','&epsilon;','&zeta;','&eta;',
				'&theta;','&iota;','&kappa;','&lambda;','&mu;','&nu;','&xi;','&omicron;','&pi;','&rho;',
				'&sigmaf;','&sigma;','&tau;','&upsilon;','&phi;','&chi;','&psi;','&omega;',
				'?','?','?','?','?','?','?');
				$v = str_replace($search, $replace, $v);

				$v = mysql_real_escape_string($v);
```


----------



## ravenstorm (22. Februar 2012)

Anscheinend nimmt das Forum hier auch nicht alle Zeichen auf .. dann habe ich in meinem Script schon einmal einen Vorteil.


----------



## Napofis (22. Februar 2012)

Ja klar weil das Forum noch ISO-8859-1 nutzt. Was ist nun mit deinen Problem? Gibt es einen Link wo man sich das mal ansehen kann?


----------



## ravenstorm (23. Februar 2012)

Ich habe mein Problem doch nun gelöst, die Lösung habe ich hier ins Forum gepostet, nur leider nimmt er es nicht so an wie das Forum es sollte.


----------



## Napofis (23. Februar 2012)

Deine Lösung ins ein ziemlicher Schmar ...


----------

