Announcement

Collapse
No announcement yet.

Neuinstallations-Problem

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

  • Neuinstallations-Problem

    Hallo,

    als Neuling in diesem Forum einen herzlichen Gruß an Alle!

    Vor 6-7 Jahren habe ich für einen Kunden von mir für seine neue Fakturiersoftware die Firebird-DB auf einem Linux-Server installiert und mit etwas Gefrickel auch zum Laufen gebracht.

    Aus verschiedenen Gründen versuche ich nun, eine existierende browserbasierende Anwendung (PHP/MySQL) von MySQL auf Firebird zu portieren - das ist also meine erste Erfahrung mit Firebird als Entwickler.

    Mittlerweile läuft die DB auf dem Linux-Server ("fb_smp_server", ist doch SuperClassic, oder?).

    Nun wollte ich ein bisschen herumtesten und habe mich von zwei Rechnern mit dem Server verbunden (siehe Skizze).
    Code:
    +---------+               +---------+
    | PC1     |               | Server  |
    | Windows |------x------->| Linux   |
    | ISQL    |     /|\       | Opensuse|
    |         |      |        |         |
    +---------+      |        +---------+
                     |
    +---------+      |
    | PC2     |      |
    | Windows |------+
    | Flame   |
    | Robin   |
    +---------+



    Auf einem Rechner habe ich händisch per Insert einen Datensatz angelegt und konnte ihn natürlich auch per select anschauen.

    Der anschließende Test-Select auf dem 2. Rechner ergab nichts - für den war die Tabelle noch leer! Erst nach dem Beenden von ISQL und einem erneuten Connect konnte ich den von Rechner 1 angelegten Datensatz sehen.

    Huch!! Das kann und darf natürlich nicht sein. Da Firebird ja bekanntermassen eine vielbenutzte und stabile Datenbank ist, wird der Fehler wohl irgendwie bei mir und meiner Installation liegen.

    Hat jemand eine Idee, was ich da falsch mache?

    Danke und viele Grüße
    Heiko

  • #2
    isql benutzt standardmäßig das Repeatable Read Isolation Level. Heißt es sieht einen konsistenten Snapshot der DB zu Begin seiner Transaktion. Um aktuelleres zu bekommen mußt also eine neue Transaktion benutzten. Ich benutzte selbst isql nicht aber ich denke mal du mußt einfach mal explizit ein Commit oder Rollback in isql ausführen.

    Comment


    • #3
      Hallo Ralf,


      danke für Deine (sehr) schnelle Antwort!

      Tja, das wars - da war nichts falsch mit meiner Installation - das war eben nur Unkenntnis ... nun klappt es.

      Ich habe im Vorfeld meines Portierungsversuchs ja bereits heftig nach den Unterschieden zwischen MySQL und Firebird gegoogelt und habe eine ganze Menge gefunden - diverse Datentypen, fehlendes auto_increment (Firebird: generator und trigger), und, und ...

      Darf ich Deine Geduld und Deine Fachkenntnis noch ein bisschen strapazieren??

      Ich habe mit meiner Test-Portierung ein bißchen weitergemacht, mit "HeidiSQL" eine Kundentabelle aus MySQL mit ca. 1600 Adressen in eine ASCII-Datei geschrieben und versucht, die in Firebird zu importieren.

      Ging natürlich schief .... in vielen Kundenadressen kommt ein Hochkomma vor, z.B. in "Gerti's Restaurant". Google is your friend - habe ich gefunden - muss doppeltes Hochkomma sein - mit dem Editor per "suchen und ersetzen" in der Datei geändert.

      In vielen Tabellen sind Datumsfelder, und in vielen Datensätzen sind sie (aus gutem Grund) leer - "MySQL" liefert dann "0000-00-00" zurück. Das muß also so bleiben.

      Fiebird mag das anscheinend nicht und liefert Fehlermeldungen. Ich habe (natürlich) gegoogelt, mit vielen Insert-Variationen herumprobiert - ohne Ergebnis. Firebird will ein gültiges Datum, basta! Ein "leeres" Datum gibt es scheinbar nicht.

      Oder?? Hast Du da einen Tipp für mich?

      Und: in größeren Textfeldern machen die Benutzer gerne der Übersichtlichkeit wegen einen Linebreak (Enter-Taste, CR/LF). "Heidi-SQL" gibt das als "\r\n" in die ASCII-Datei aus, und beim Importieren schluckt MySQL das klaglos.

      Firebird nicht! Ich habe da wirklich exzessiv herumgegoogelt und abenteuerliche Konstrukte gefunden (per UDF ...?), aber kein einziges "Insert"-Beispiel, mit dem man "\r\n" firebird-konform umsetzen und das Ergebnis importieren kann.

      Ich vermute, daß geht ganz einfach. Aber wie?? Weisst DU es??? Wäre toll ....

      Nochmal: Danke! Und wenn Du auf meine Fragen Antworten hast: ich freue mich drauf!

      Gruß Heiko

      Comment


      • #4
        Originally posted by heikobuss View Post
        ..
        In vielen Tabellen sind Datumsfelder, und in vielen Datensätzen sind sie (aus gutem Grund) leer - "MySQL" liefert dann "0000-00-00" zurück. Das muß also so bleiben.
        ..
        Und: in größeren Textfeldern machen die Benutzer gerne der Übersichtlichkeit wegen einen Linebreak (Enter-Taste, CR/LF). "Heidi-SQL" gibt das als "\r\n" in die ASCII-Datei aus, und beim Importieren schluckt MySQL das klaglos.
        ..
        Den Datumswert "0000-00-00" würde ich mit Wert Null ersetzen (ohne Anführungszeichen). Setzt voraus, dass die Tabellen in den Feldern auch leere Werte (NULL) erlauben.
        Die Zeilenenden solltest Du am besten mit einem Editor wie Notepad++ oder lime oder auch irgendwas unter Linux (vi, ..) ersetzen.
        Welcher Wert hingehört weiß ich nicht auswendig. Normalerweise ist es unter Linux NL (newline), Dezimal 10, Hex 0xA. Unter Windows CRLF, CarriageReturn LineFeed, dez. 13 10, hex. 0xD 0xA.

        Wenn Du unter Windows nach Firebird importierst würde ich 10 13 nehmen, unter Linux eben nur 10.
        Gruß, defo

        Comment


        • #5
          Hallo defo,

          danke für Deine Antwort.

          Ich habe mit dem Datumsfeld noch weiter herumexperimentiert.

          Beim Tabellen-Erstellen darf in der Feldbeschreibung nicht "NOT NULL" auftauchen. Dann setzt Firebird dort eben "NULL" ein und gibt beim Lesen eben auch "NULL" zurück - im Gegensatz zu MySQL (liefert "0000-00-00" zurück).


          Mit dem Konvertieren von CR/LF in ein Firebird-konformes Format bin ich noch nicht weiter.

          Ich habe ja den Adressenbestand aus MySQL in eine ASCII-Datei geschrieben und will damit Firebird füttern. Die Ausgabe aus MySQL sieht z.B. so aus:

          Code:
           INSERT INTO adressen (name, ort, kommentar) VALUES ('meier', 'Xstadt', 'test\r\nnoch mehr text');
          wobei "\r\n" eben für CR/LF steht - beim Import schluckt MySQL das problemlos.

          In was muss ich dieses "\r\n" per Editor in der ASCII-Datei tauschen, damit ich Firebird damit füttern kann? Das ist hier die Frage .....

          Schönen Tag!

          Gruß Heiko

          Comment


          • #6
            Beim Tabellen-Erstellen darf in der Feldbeschreibung nicht "NOT NULL" auftauchen. Dann setzt Firebird dort eben "NULL" ein und gibt beim Lesen eben auch "NULL" zurück - im Gegensatz zu MySQL (liefert "0000-00-00" zurück).
            Das Konzept eines ungültigen Datums (also ein Datum in dem ich Teile wie Tag, Monat, Jahr auf 0 setzen darf) ist etwas MySQL Spezifisches. Das erscheint mir zum speichern und damit arbeiten auch meist ungünstig. Was kommt da raus bei einem ungültigen Datum + 3 Tage (und ich meine jetzt nicht was MYSQL macht sondern was man als unwissender User erwarten würde) ? Datenbanken speichern ein Datum üblichwerweise als Zahlentyp in der Form vergangener Zeit seit Stichtag. Damit läßt sich hervorragend rechnen läßt aber keinen Raum für ein ungültiges Datum.

            In was muss ich dieses "\r\n" per Editor in der ASCII-Datei tauschen, damit ich Firebird damit füttern kann? Das ist hier die Frage .....
            Gegen einen Zeilenumbruch?

            [HIGHLIGHT=SQL]
            INSERT INTO adressen (name, ort, kommentar) VALUES ('meier', 'Xstadt', 'test
            noch mehr text');[/HIGHLIGHT]

            Comment


            • #7
              Hallo Ralf,

              es gibt viele Gründe für ein "leeres" (noch nicht ausgefülltes) Datumsfeld. In meinem Portierungsversuch (Kundenstamm) befindet sich zum Beispiel ein Feld "Geburtstag". Bei 90% der 1.600 Adressen ist kein Datum eingetragen (bei MySQL "000-00-00", bei Firebird eben NULL). Aber bei dem Rest der wichtigen und umsatzstarken Kunden steht eins drin - da wird dann eben eine Geburtstagskarte oder sogar ein kleines Geschenk verschickt - ein Schelm, wer Böses dabei denkt ...

              Was fällt mir noch an Gründen ein? Der Personalstamm bei einem Lohnprogramm (Eintrittsdatum ausgefüllt, Austrittsdatum noch nicht). Im Rechnungskopf-Datensatz Rechnungsdatum/Datum der Zahlung. In der Einkaufsabteilung im Bestelldatensatz Datum Bestellung/Datum Lieferung. Und so weiter ....


              Mit der Umsetzung CR/LF ("\r\n") nach Firebird bin ich noch nicht weiter. Ich habe mit zwei verschiedenen Editoren (und sogar mit "Word" ...) versucht, in meiner ASCII-Datei bei 1.600 Datensätzen den Textstring "\r\n" in den binären Wert 10 zu ändern - leider ergebnislos. Wie machst Du das?

              Viele Grüße
              Heiko

              Comment


              • #8
                https://www.textpad.com/products/textpad/index.html
                -> siehe in der Hilfe Regulären Ausdruck Zeilenende

                Du musst das näher beschreiben:
                Hast du wirklich Text in der Form "\r\n" sichtbar stehen?
                Oder willst du den Zeilenumbruch von Windows nach Linux ändern?

                Ggf. ist das schnell mit einem kleinen Programm erledigt, dass die Datei einliest und neu schreibt
                Christian

                Comment


                • #9
                  Hallo Christian

                  danke für Deinen Beitrag - ich bin wirklich überrascht, wie schnell und wieviel Leute auf meine Fragen antworten - finde ich toll!

                  Ich dachte, in meinen Postings vom 05.01.2015 und vom 06.01.2015 hätte ich mein Problem verständlich geschildert - scheinbar war ich zu ungenau.

                  Also: für meine Testportierung MySQL --> Firebird habe ich mit dem grafischen Administrationsprogramm "HeidiSQL" (vormals: MySQLFront) von einem Kundenstamm die Tabellendefinitionen und den Inhalt der Datenbank in eine ASCII-Datei dedumpt (in der Form "insert into aa (bla, bla) values ('bla', ' bla', ...). Das kann man ja mit den meisten GUI-Adminprogrammen machen. Mit dieser ASCII-Datei könnte man eine andere (MySQL-) Datenbank füttern und die Tabellen anlegen und die Daten laden.

                  In diesem Kundenstamm ist ein größeres Textfeld, in dem die Benutzer gewisse Vermerke und Notizen für jeden Kunden unterbringen können. Und der Übersichtlichkeit wegen machen sie zwischen den einzelnen Notizen gerne mal einen Zeilenumbruch ("Enter"-Taste).

                  Dieser Zeilenumbruch wird beim Dumpen in eine ASCII-Datei eben als Textstring "\r\n" (unter Windows, unter Linux nur "\n") ausgegeben. Füttert man MySQL damit, erkennt es diesen Textstring und wandelt es eben wieder in die entsprechenden Hex-Werte (0d0a) zurück - alles ist gut.

                  Ich vermute, daß es eben auch beim Import nach Firebird entsprechende ASCII-Symbole für CR/LF gibt - aber welche??? Das ist eben die Frage ....

                  Schöne Grüße
                  Heiko

                  Comment


                  • #10
                    Die Symbole sind immer gleich. Sie richten sich nach dem Betriebssystem.

                    System Hexadezimal Dezimal Zeichen
                    Windows 0D 0A 13 10 \r\n
                    Unix,Linux 0A 10 \n
                    MAC 0D 13 \r
                    Christian

                    Comment


                    • #11
                      Ich vermute, daß es eben auch beim Import nach Firebird entsprechende ASCII-Symbole für CR/LF gibt - aber welche???
                      0x0d und 0x0a sind ASCII Symbole man braucht keinen anderen um die darzustellen (also Escape Sequenzen wie \r oder \n) . Schreib einfach denjenigen Zeilenumbruch (als Zeilenumbruch) da hin den du möchtest.

                      Comment


                      • #12
                        Es wäre ja erstmal festzustellen, ob Firebird das kann. Finde das schon ein seltsames Verhalten, das der Inhalt einer Zeichekette interpretiert wird. Es könnte ja wirklich textuell da stehen sollen.
                        Kann Firebird das, wäre "\r\n" durch "\n" oder "\r" zu ersetzen.
                        Kann Friebird das nicht wäre der Text (String) "\r\n" durch einen Zeilenumbruch (\n oder\r) zu ersetzen.
                        Christian

                        Comment


                        • #13
                          Hallo Christian,


                          es hat geklappt - CR/LF bei Firebird gelöst!


                          Ich mag es gar nicht erzählen, aber ich tu's trotzdem .....

                          Ich arbeite seit Anfang der 90er-Jahre sehr viel mit Unix (damals SCO-Unix, da war Linux noch im Anfangsstadium).

                          Jeder weiß: Windows hat als Zeilenende in Textfiles das berühmte "\r\n", Linux nur "\n". Doch Unix/Linux kennt sehr wohl den Carriage Return ("\r"). Ich habe seinerzeit sehr viel Shellskripte erstellt, und die Shell interpretiert das "\r" völlig korrekt - es schickt den Cursor brav wieder an den Zeilenanfang.

                          Firebird mag den CR nicht! Ich habe per Editor in allen 1.600 Datensätzen das "\r\n" einfach gegen "\n" getauscht und Firebird damit gefüttert - und der Feuervogel hats gefressen ....

                          Tja, manchmal seht man vor lauter Bäumen den Wald nicht - Kopf-gegen-die-Wand-schlag .....

                          Ich danke allen für ihre freundliche Unterstützung!!!!

                          Alles Gute
                          Heiko

                          Comment

                          Working...
                          X