Der-Dennis: PHP / PDO / MySQL: Beim Datentyp float wird ein Komma statt eine

Hallo zusammen,

nachdem wir den Server gewechselt haben tritt bei uns ein recht merkwürdiges Problem auf.

In einer MySQL-Tabelle stehen einige float-Werte, die dort auch wie gewohnt einen Punkt als Trennzeichen enthalten.

Fragen wir jetzt (mit oder ohne PDO) Werte aus dieser Tabelle ab, so werden sie mit einem Komma statt mit einem Punkt versehen ausgeliefert. Also beispielsweise 0,3 statt 0.3.

PHP rechnet allerdings bekanntlich float-Werte nur mit einem Punkt als Trennzeichen.

Eine Lösung für dieses Problem ist:
$var = (float) str_replace(',', '.', $var);

Allerdings kann es ja nicht Sinn der Sache sein, alle Werte vorher so zu verändern. Zumal dieses Problem noch nie aufgetreten ist und meine Internet-Recherchen nichts zutage gefördert haben.

Deshalb meine Frage: Hat schon einmal jemand ein vergleichbares Problem gehabt? Oder eine Idee, woran das liegen könnte?

Eine Idee war, dass es sich um PHP-Locale-Einstellungen handeln könnte. localeconv() gibt allerdings auf beiden Servern exakt das gleiche Ergebnis aus.

Danke für Eure Hilfe!

Gruß, Dennis

  1. Hallo,

    In einer MySQL-Tabelle stehen einige float-Werte, die dort auch wie gewohnt einen Punkt als Trennzeichen enthalten.

    in Spalten welchen Datentyps? Alles andere als ein numerischer Datentyp wäre ein grober Fehler.

    Fragen wir jetzt (mit oder ohne PDO) Werte aus dieser Tabelle ab, so werden sie mit einem Komma statt mit einem Punkt versehen ausgeliefert. Also

    und was erhältst Du, wenn Du einen anderen Client als PHP verwendest?

    beispielsweise 0,3 statt 0.3.

    Hast Du einen numerischen Datentyp verwendet, dann hast Du ein Darstellungsproblem. Hast Du einen Zeichenkettendatentyp verwendet, dann hast Du etwas falsch gemacht. Möglicherweise sind dann Kommas statt Punkten gespeichert. Konvertiere die Daten in ein brauchbares Format. Mach vorher ein Backup.

    Freundliche Grüße

    Vinzenz

    1. Hallo Vinzenz,

      vielen Dank für Deine Antwort. Die Spalten haben den Typ float, hatte ich eben vergessen zu schreiben. Haben die Spalten auch mal testweise in double geändert - wie zu erwarten ohne Erfolg.

      Wenn man in den PhpMyAdmin schaut, zeigt er die Werte auch richtig an, also mit Punkt. Macht man allerdings eine eigene SQL-Abfrage, zeigt PhpMyAdmin den Wert mit Komma an!?

      Die SQL-Abfrage über die Konsole ausgeführt ergibt das richtige Ergebnis mit Punkt.

      Beide Server sind übrigens in etwa vergleichbar. PHP und MySQL-Version sind genau gleich. Auch Neu-Installationen von PHP und MySQL und Neu-Import der Datenbank brachten keinen Erfolg.

      Alles ganz schön merkwürdig.

      Wir sind mittlerweile der Ansicht, es könnte sich doch um irgendwelche Locale-Einstellungen etnweder in PHP oder auf dem Server handeln. Es klingt auf jeden Fall vorerst plausibel. Hast Du da irgendwelche Ideen, was es da bei PHP oder beim Apache für Einstellungen gibt? Wie gesagt, von so einem Problem hab ich noch nie gehört.

      Vielen Dank!

      Gruß, Dennis

      1. Hallo Dennis,

        Wenn man in den PhpMyAdmin schaut, zeigt er die Werte auch richtig an, also mit Punkt. Macht man allerdings eine eigene SQL-Abfrage, zeigt PhpMyAdmin den Wert mit Komma an!?

        Die SQL-Abfrage über die Konsole ausgeführt ergibt das richtige Ergebnis mit Punkt.

        sieht nach einem Darstellungsproblem aus, das rein PHP-bedingt ist. Sowas ist mir bisher <del>leider</del> noch nicht untergekommen.

        Freundliche Grüße

        Vinzenz

        1. Mir wie gesagt auch noch nicht.

          Ich melde mich auf jeden Fall, wenn wir eine Lösung gefunden haben.

          Und wenn sonst noch jemand eine Idee hat: Immer her damit!

          Gruß, Dennis

          1. Wir haben das Problem soweit behoben.

            In dem Projekt wurde in einer Datei

              
            <?php  
            setlocale(LC_ALL, array('de_DE.UTF-8', 'deu_deu.65001'));  
            
            

            aufgerufen, was anscheinend das Problem auslöst. Eine Änderung auf

              
            <?php  
            setlocale(LC_ALL, 'en_US.UTF-8');  
            
            

            brachte keinen Erfolg, dafür aber die Änderung auf

              
            <?php  
            setlocale(LC_ALL, 'en_US.8859-1');  
            
            

            Warum auch immer das der Fall ist.

            Insgesamt ist es nun so, dass der Großteil der Server die setlocale()-Deklaration einfach ignoriert, was bei unseren vorherigen Servern wohl auch der Fall war. Höchstwahrscheinlich sind bestimmte Server- oder php.ini-Einstellungen dafür verantwortlich, die wir aber noch nicht näher bestimmen konnten. Hat jemand eine Idee hierzu?

            Deshalb konnten wir das Problem auch so schlecht finden. Wie gesagt, vorher lief alles super, erst beim Umzug fiel das Problem auf. Denn eigentlich übernimmt unsere View die Aufgabe, die Ausgabe bezüglich der länderspezifischen Einstellungen zu ändern. Hier stand also im "Modus deutsch" immer ein Komma statt einem Punkt, obwohl PHP mit englischen Fließkommazahlen gerechnet hatte.

            Eine große Frage bleibt jedoch noch im Raum: Warum sind die Locale-Einstellungen augenscheinlich das Problem, dass PHP mit diesen Werten nicht mehr rechnen kann? Warum werden diese bereits beim Auslesen aus der Datenbank genutzt und nicht erst, wenn Werte ausgegeben werden? Denn sollte sich dies bestätigen, wären sie doch vollkommener Unsinn. Warum sollte ich die Einstellungen benutzen, wenn ich die Werte zwischendurch wieder in das englische System übertragen muss, um sie anschließend wieder für die Ausgabe zu ändern!?

            Wenn noch jemand Ideen hierzu hat, würde ich mich sehr freuen, von Euch zu hören.

            Gruß, Dennis

            1. Hi!

              Eine Änderung auf
              setlocale(LC_ALL, 'en_US.UTF-8');
              brachte keinen Erfolg, dafür aber die Änderung auf
              setlocale(LC_ALL, 'en_US.8859-1');

              Warum auch immer das der Fall ist.

              setlocale() hat einen Rückgabewert. Was ergibt der, wenn du die UTF-8-Variante probierst? (var_dump() zum Anzeigen verwenden!)

              Insgesamt ist es nun so, dass der Großteil der Server die setlocale()-Deklaration einfach ignoriert, was bei unseren vorherigen Servern wohl auch der Fall war. Höchstwahrscheinlich sind bestimmte Server- oder php.ini-Einstellungen dafür verantwortlich, die wir aber noch nicht näher bestimmen konnten. Hat jemand eine Idee hierzu?

              locale -a
              zeigt alle verfügbaren an - sprich: alle installierten. php.ini hat damit nichts zu tun.

              Lo!

              1. Hey dedlfix,

                setlocale() hat einen Rückgabewert. Was ergibt der, wenn du die UTF-8-Variante probierst? (var_dump() zum Anzeigen verwenden!)

                guter Hinweis, hab's grad mal getestet:

                  
                var_dump(setlocale(LC_ALL, 'en_US.UTF-8'));  
                
                

                ergibt bool(false).

                  
                var_dump(setlocale(LC_ALL, 'en_US.8859-1'));  
                
                

                ergibt allerdings auch bool(false)!?

                Keine Ahnung, warum das denn nun so ist.

                Gruß, Dennis

  2. Hallo zusammen,

    Deshalb meine Frage: Hat schon einmal jemand ein vergleichbares Problem gehabt? Oder eine Idee, woran das liegen könnte?

    Das Verhalten wird von setlocale beeinflusst. Offenbar ist da ein Wert für Deutschland voreingestellt. Hier steht, wie du das ändern kannst:

    http://de.php.net/manual/en/function.setlocale.php

    Grüße
    Erik

    1. Hallo Erik,

      hab Deine Antwort leider erst gerade gelesen. Aber vielen Dank dafür. Hier ist mein aktueller Stand zu dem Thema

      Gruß, Dennis