Announcement

Collapse
No announcement yet.

Leerzeichen in Char(3000) Feld

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

  • Leerzeichen in Char(3000) Feld

    Hallo zusammen,
    ich arbeite mit Interbase 6.0.0.627 und den InterBase Komponenten in Delphi. Nun ist mir beim bearbeiten eines als CHAR(3000) definierten Feldes in einem DBMemo aufgefallen, dass ich immer die Leerzeichen offensichtlich bis zur Feldgrösse von 3000 Zeichen am Ende meines Textes habe. Woher kommen diese Leerzeichen? Wie kann ich diese unterdrücken (sie stören mich beim Bearbeiten des Textes).

    Im Voraus vielen Dank für jeden Tipp.

    Thomas

  • #2
    Hallo Thomas,

    statt dem Datentyp Char verwende Varchar(3000) und schon ist das Problem gelöst.

    In der DB werden die zusätzlichen Leerzeichen nicht mit gespeichert, sondern vom Server dynamisch bei der entsprechenden Anfrage hinzugefügt.

    Tschau

    Torste

    Comment


    • #3
      Hallo,

      falls die Datenbank nicht umgebaut werden kann, weil sie gerade aktiv genutzt wird, kann das feld auch mit trimright(DBFeld) aufgerufen werden.

      Gruß Günte

      Comment


      • #4
        Hallo zusammen und vielen Dank für die Tipps.
        Werde es gleich ausprobieren.

        Thoma

        Comment


        • #5
          Hallo Torsten,

          das Ändern in VARCHAR(3000) hat leider keinen Erfolg gebracht. Ich denke doch das die Zeichen gespeichert werden, denn ich mache eine Replikation in eine MySQL-Datenbank und da ist das Feld dann eben voll gefüllt mit 3000 Zeichen was mir bei der Internet-Darstellung einen unschönen Zwischenraum verursacht.
          In MySQL ist mir ähnliches Verhalten nicht bekannt.

          Gruss Thoma

          Comment


          • #6
            Hallo Thomas,

            die bestehenden Daten werden durch die Änderung des Datentypes natürlich nicht verändert. Sie haben ja bereits eine Länge von 3000 Zeichen.

            Mach ein Update auf die entsprechende Spalte mit einer entsprechenden UDF zum trimmen.

            Tschau

            Torste

            Comment


            • #7
              Hallo Torsten,

              mit den bestehenden Daten hat dies nichts zu tun. Ich habe die alte Tabelle gelöscht (drop table) und eine neue angelegt und diese über die IB Konsole einen Datensatz eingefügt. Es bringt mich alles nicht weiter. Mit trimright(string) tut sich leider auch nichts. Kann es von einer Einstellung in der Interbase-DB-Komponente kommen?

              Gruss Thoma

              Comment


              • #8
                Hallo Thomas,<br><br>
                hast Du beim Neuanlegen der Tabelle nun einen VARCHAR verwendet? Wenn ja, und wenn die Zeichenkette in Deiner Web-Anwendung weiterhin in voller Länge angezeigt wird, dann liegt es entweder an der Replikation zwischen InterBase und MySQL, oder MySQL selbst bietet wiederum einen Datentyp an, der die Zeichenkette mit Leerzeichen bis zur vollen Länge auffüllt.<br><br>
                PS: InterBase 6.0.0.627 ist eine <b>sehr</b> frühe IB 6 Version mit etlichen Bugs, die Dich vielleicht noch nicht betroffen haben. Ich würde, wenn es nicht allzu große Umstände macht, auf InterBase 6.0.1.6 upgraden ( http://mers.com ), oder vielleicht auch einen Blick auf Firebird zu werfen ( http://www.firebirdsql.org ).<br><br>
                Gruss,<br>
                Thoma
                Thomas Steinmaurer

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

                Comment


                • #9
                  Hallo Thomas,

                  das ist das Script für die Tabelle:

                  CREATE DOMAIN CH100 AS VARCHAR(100) CHARACTER SET ISO8859_1;
                  CREATE DOMAIN CH50 AS VARCHAR(50) CHARACTER SET ISO8859_1;
                  CREATE DOMAIN DT AS TIMESTAMP NOT NULL;
                  CREATE DOMAIN ID AS INTEGER NOT NULL;
                  CREATE DOMAIN SMINT AS SMALLINT;
                  CREATE DOMAIN VC1000 AS VARCHAR(1000) CHARACTER SET ISO8859_1;
                  CREATE DOMAIN VC3000 AS VARCHAR(3000) CHARACTER SET ISO8859_1;

                  /* Table: NEWSLETTER, Owner: SYSDBA */

                  CREATE TABLE NEWSLETTER
                  (
                  NEWS_ID ID,
                  NEWS_NAME CH50,
                  DESCRIPTION VC3000,
                  SUBJECT CH100,
                  HEADER VC1000,
                  FOOTER VC1000,
                  CREATEDATE DT,
                  RECORDSTATUS SMINT,
                  PRIMARY KEY (NEWS_ID)
                  );
                  Wie Du erkennst geht es um eine Tabelle für eine Newsletter. Die 3000 Zeichen sind, wie gesagt, schon in der IB-Datenbank, bevor ich überhaupt repliziere (diese Tabelle habe ich noch nicht repliziert, habe aber die Erfahrung schon bei einer anderen Tabelle gemacht).
                  Aber ich werde es einmal versuchen mit einem Update.

                  Gruss Thoma

                  Comment


                  • #10
                    Hallo Thomas,

                    ich habe eine neuere Version installiert, die Tabelle gelöscht und neu angelegt - das Phänomen war immer noch vorhanden.
                    Dann habe ich eine neue Testdatenbank angelegt im Dialect 3 (die alte ist noch Dialect 1) - und dann war das DBMemo tatsächlich nur so lang, wie auch Zeichen drin stehen. Daran scheint es wohl zu liegen.

                    Vielen Dank ringsum.

                    Gruss Thoma

                    Comment

                    Working...
                    X