Announcement

Collapse
No announcement yet.

upper -> "nicht immer aber immer seltener" :-(

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • upper -> "nicht immer aber immer seltener" :-(

    Folgendes Problem:

    Bei mir habe ich nun 2 Datenbanken, auf beiden wird folgender Select ausgeführt.

    <PRE> SELECT UPPER(adrort) FROM adr_adresse.... </PRE>

    auf der einen erhalte ich: ZÜRICH
    auf der anderen: ZüRICH

    An der Tabellen-Definition habe ich keinen Unterschied feststellen können.

    beide sind deklariert als
    <PRE> VARCHAR(40) CHARACTER SET ISO8859_1 </PRE>

    Brauche dringend hilfe!!

    Backup/Restore hat nichts gebracht.

  • #2
    Hallo Urs,<br><br>
    ob nun das "Built-In UPPER" Umlaute korrekt interpretiert oder nicht, hängt nicht nur vom verwendeten Zeichensatz, sondern auch von der Collation ab. Verwendet man für ein [VAR]CHAR Feld den Zeichensatz ISO8859_1 und gibt keine Collation mit an, dann wird die Collation ISO8859_1 verwendet, und mit dieser Kombination schlägt auch das UPPER "fehl". Verwendet man als Collation DE_DE, dann kommen auch für Umlaute Großbuchstaben zurück. Im Prinzip hast Du folgende Möglichkeiten:<br><br>
    - Beim Erzeugen der Felder die entsprechende Collation mitangeben, oder besser Domains verwenden, die bereits die richtige Collation verwenden, oder <br><br>
    - Beim UPPER kann auch die Collation innerhalb eines Zeichensatzes mitangegeben werden. z.B. SELECT UPPER(NAME COLLATE DE_DE) FROM ..., oder <br><br>
    - In den unterschiedlichen UDF-Libraries gibt es Funktionen, die intern z.B. die AnsiUpperCase Funktion von Delphi zum Umwandeln verwenden<br><br>
    Gruss,<br>
    Thoma
    Thomas Steinmaurer

    Firebird Foundation Committee Member
    Upscene Productions - Database Tools for Developers
    Mein Blog

    Comment


    • #3
      Hallo Thomas

      Danke vielmals, das funktioniert!

      In der Ib-Console hatts mir bei beiden Tabellen keine Collation angezeigt. Kann ich eine default Collation [zu Character Set iso8859_1] auf der DB definieren?

      oder

      Wie kann ich nachträglich die Collation einer Spalte ändern?

      Grus

      Comment


      • #4
        Hallo Urs,<br><br>
        &gt; Kann ich eine default Collation [zu Character Set iso8859_1] auf der DB definieren?<br><br>
        Theoretisch ja, praktisch würd ich davon abraten. Die Default-Collation für den Zeichensatz ISO8859_1 ist ISO8859_1. Dies ist in einer Systemtabelle von InterBase hinterlegt. D.h. man könnte diesen Wert entsprechend auf DE_DE ändern, dann würden alle <b>neu</b> angelegten [VAR]CHAR Felder beim Weglassen der Collation automatisch mit DE_DE angelegt. Diese Änderung in der Systemtabelle überlebt allerdings kein Backup/Restore, d.h. nach jedem Restore müßte dieser Wert in der Systemtabelle wieder geändert werden, und so etwas vergißt man sehr gerne (vor allem wenn man beim Kunden ist, und dies vielleicht auch noch unter Streß ;-)). Darum sollte man sich angewöhnen die Collation bei der Felddefinition mitanzugeben. Und, vergiß gleich wieder die Sache mit der Systemtabelle, weil <b>Finger weg von den Systemtabellen</b> ;-).<br><br>
        &gt; Wie kann ich nachträglich die Collation einer Spalte ändern?<br><br>
        Gar nicht. Es gibt dafür kein DDL-Statement.<br><br>
        Gruss,<br>
        Thomas
        Thomas Steinmaurer

        Firebird Foundation Committee Member
        Upscene Productions - Database Tools for Developers
        Mein Blog

        Comment


        • #5
          Interbase 6.0:

          update RDB$RELATION_FIELDS set
          RDB$COLLATION_ID = 0 /*0 = ISO8859_1, 6 = DE_DE*/
          where (RDB$FIELD_NAME = 'ADRORT') and
          (RDB$RELATION_NAME = 'ADR_ADRESSE')

          unter vorbehalt! vorher datenbank sichern mittels backup!

          grüße
          holge

          Comment


          • #6
            Hallo Holger,<br><br>
            &gt; vorher datenbank sichern mittels backup!<br><br>
            Guter Hinweis, weil ein Update auch RDB$FIELDS betreffen sollte, und bei einer Änderung von ISO8859_1 auf DE_DE ein Wechsel zu einer Multi-byte Collation erfolgt, die dann Indizes auf Feldern > 84 Zeichen nicht erlaubt. D.h., auf die schnelle sieht es aus, als wenn man Erfolg hatte, aber letztendlich bekommt man eine Datenbank, die mit gbak nicht mehr zurückgesichert werden kann. ;-)<br><br>
            Gruss,<br>
            Thoma
            Thomas Steinmaurer

            Firebird Foundation Committee Member
            Upscene Productions - Database Tools for Developers
            Mein Blog

            Comment


            • #7
              Hallo Thomas,

              > Indizes auf Feldern > 84 Zeichen nicht erlaubt

              den Teil kenn ich noch nicht, aber bei dem Feld, bei dem ich es ausprobiert habe ware es auch 80 Zeichen. Danke für den Tip! :-)

              Viele Grüße
              Holge

              Comment


              • #8
                Hallo Holger,<br><br>
                und dieses Limit wird nochmals kleiner, wenn es sich um einen zusammengesetzten Index auf mehreren [VAR]CHAR Feldern mit einer Multi-Byte Collation handelt. ;-)<br><br>
                Gruss,<br>
                Thoma
                Thomas Steinmaurer

                Firebird Foundation Committee Member
                Upscene Productions - Database Tools for Developers
                Mein Blog

                Comment


                • #9
                  Hallo Thomas,

                  na gut, man kann ja den Index vorher droppen, die Collation ändern und hinterher wieder aufbauen :-) Oder spricht was dagegen?

                  Grüße

                  Holge

                  Comment


                  • #10
                    Hallo Holger,<br><br>
                    der Index läßt sich dann in diesem Fall nicht mehr anlegen.<br><br>
                    Gruss,<br>
                    Thoma
                    Thomas Steinmaurer

                    Firebird Foundation Committee Member
                    Upscene Productions - Database Tools for Developers
                    Mein Blog

                    Comment

                    Working...
                    X