dr.colossos: ORACLEs Tausender/Dezimaltrennzeichen

Hi,

ich habe hier eine ORACLE-DB am laufen (ORACLE 10g, sollte aber möglichst mit 7 - 11 auch funktionieren), mit der ich über PHP unter anderem auch DECIMAL-Felder selektiere.

In der Standard-Installation liefert die DB die Dezimalfelder mit einem Komma als Dezimaltrennzeichen, was ungünstig ist für spätere Berechnungen seitens PHP (und nein, die Berechnungen kann/will ich nicht auf der DB selber machen).

Nun, durch absetzen der Anfrage ...

ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,';

... wird das Dezimaltrennzeichen auf den Punkt gesetzt.

Allerdings bekomm ich keine Tausender-Trennzeichen (was nun ja das Komma sein muesste).
Die will ich auch natuerlich nicht, aber da das Programm beim Kunden auch laufen muss, muesste ich wissen welche Einstellung dafuer verantwortlich ist, warum es nicht kommt.

Auf [link=http://www.csee.umbc.edu/help/oracle8/server.815/a67789/ch2.htm#92049] kommen auch Tausender-Trennzeichen, und ich befürchte halt, dass wenn beim Kunden wieder was anderes eingestellt ist, so hab ich zwar den Punkt als Dezimaltrennzeichen, aber leider auch das Komma als Tausendertrennzeichen, und PHP steigt mir da aus.

Weiss da jemand was?

Besten Dank!

  1. Hi,

    weiss da wirklich niemand Bescheid?

    Ich müsste eh nur wissen, wie man den group separator ( = Tausendertrennzeichen) sicher deaktivieren kann ...

    Hängt es evtl. vom Datentyp des Feldes ab. Es wären hier jeweils FLOATs.

    Das einzige was ich noch gefunden habe ist folgendes:

    SELECT TO_CHAR(price, '9999') AS "price" FROM product_price;

    Damit könnte man die Tausendertrennzeichen durch das Pattern ('9999') auch eleminieren, nur dann hab ich eine String statt einer Zahl, und auf denen kann ich nicht richtig sortieren (z,B. negative Zahlen), mal abgesehen von dem Aufwand den ich treiben müsste ...

    Wer weiss eine vernünftige Lösung?
    Danke

  2. Hallo!

    In der Standard-Installation liefert die DB die Dezimalfelder mit einem Komma als Dezimaltrennzeichen, was ungünstig ist für spätere Berechnungen seitens PHP (und nein, die Berechnungen kann/will ich nicht auf der DB selber machen).

    Nunja, wenn Du die Zahl in PHP dann schon als float hast, warum nimmst Du dann nicht einfach in PHP die Funktion number_format()? Dann muss Oracle Dir ja auch keinen Tausendertrenner liefern.

    Ansonsten: Wenn ich es richtig im Kopf habe (kann mich auch täuschen), verwendet Oracle den "Group Separator" nur dann, wenn Du ein 'G' in Deinem Format für TO_CHAR stehen hast - z.B. TO_CHAR(wert, '9G999'), das G wird durch den eingestellten Wert ersetzt).

    Viele Grüße,
    Christian

    1. Hi,

      danke fuer deine Antwort.

      Nochmals vorab.

      Im Moment habe ich KEINE 1000er-Zeichen, und ich WILL auch keine 1000er-Zeichen. Ich will nur sicher sein, dass sie bei einem Kunden auch nicht kommen. Ich habe aber nirgends gefunden wie man die 1000er-Zeichen deaktivieren kann (siehe 4.).

      Nun zu deiner Antwort.

      1. "Nunja, wenn Du die Zahl in PHP dann schon als float hast ..."

      Hab ich ja nicht, es kann ja, falls das 1000er-Trennzeichen drin ist, etwas wie 19,999.99 zurückkommen, das ist für PHP ein String, oder zumindest kein float.

      2. " ... warum nimmst Du dann nicht einfach in PHP die Funktion number_format()? Dann muss Oracle Dir ja auch keinen Tausendertrenner liefern."

      Ich will die 1000er-Zeichen ja NICHT. Klar, ich koennte jedes Resultat meiner Queries ggf. mit number_format anpassen, aber da muss es doch besseres geben, dass ist ja unnötiger overhead.

      3. Ich glaube du hast mich falsch verstanden.

      Es geht um folgendes:

      $result = db_query(SELECT prize FROM prices WHERE id=1);
      // $result kann nun Werte wie 0.99, 3.99, 199.99, 19,999.99 haben

      Ich habe nirgends gefunden wo ich den GROUP SEPARATOR umgehen kann, denn ich brauch ihn nicht, besser gesagt, ich DARF ihn nicht bekommen.

      Ich will den "." als Dezimaltrennzeichen, und NICHTS mehr, keine 1000er-Trennzeichen oder Waehrungssymole etc. Jedes andere DBMS dass ich mit PHP ansteuere macht das auch so (in seiner Normaleinstellung), denn so rechnet man halt mit floats.

      Im DB-Feld steht 19999.99, also will ich auch in PHP 19999.99.

      4. »» Ansonsten: Wenn ich es richtig im Kopf habe (kann mich auch täuschen), verwendet Oracle den "Group Separator" nur dann, wenn Du ein 'G' in Deinem Format für TO_CHAR stehen hast - z.B. TO_CHAR(wert, '9G999'), das G wird durch den eingestellten Wert ersetzt).

      Okay, wenn er den GROUP SEPARATOR tatsächlich nur einfuegt wenn ich mit "TO_CHAR" arbeite, dann waere ich schon zufrieden.

      Nochmal zusammenfassen. Ich will einfach vermeiden, dass ich in PHP aufeinmal einen Ausdruck "$produkt = 19,999.00 * 2;" stehn habe, weil dass nicht gut geht.

      Im Moment krieg ich von ORACLE die Werte auch richtig, aber ich musste trotzdem ja einen GROUP SEPARATOR angeben bei ...

      "ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,';".

      Woher weiss ich, dass beim Kunden dann nicht doch der "." als GROUP SEPARATOR auftritt.

      Kannst du mir noch folgen?

      Danke!

      1. Hallo!

        Okay, wenn er den GROUP SEPARATOR tatsächlich nur einfuegt wenn ich mit "TO_CHAR" arbeite, dann waere ich schon zufrieden.

        Garantieren kann ich Dir es nicht, aber alle Oracle-Installationen, mit denen ich bisher gearbeitet habe (das waren diverse 8i, 9i und 10i) lieferten nie (!) den group separator zurück, wenn man eine derartige Spalte / einen derartigen Wert einfach selektiert hat.

        Woher weiss ich, dass beim Kunden dann nicht doch der "." als GROUP SEPARATOR auftritt.

        Meines Wissens wird der group separator nur bei expliziter Angabe in TO_CHAR eingefügt. Garantieren kann ich's aber wie gesagt leider nicht.

        Viele Grüße,
        Christian

        1. Top!

          Vielen Dank!

          Ich glaub alles was du sagst solange es das is was ich hoeren will, hehe.

          Nochmals vielen Dank ... ich verlass mich einfach mal drauf, dass es so ist wie du sagst ...