bytea Probleme

Hallo zusammen,

ich habe ein problem mit dem Speichern eines bytearrays in ein bytea feld.

wenn ich in java diesen array in das feld speichere, und ihn danach wieder heraushole ist es ein anderer als ich gespeichert habe(sogar die länge ist verändert).

ich verzweifle langsam daran, ich probiere schon seit 2 tagen das problem zu lösen aber ich komm einfach nicht weiter.

ich hoffe ja das das ein bekanntes problem ist und es da ne ganz einfache lösung gibt, ich bin für jeden vorschlag dankbar, denn ich hbe nichtmal ne idee woran das denn genau liegen könnte.

mfg vino

Wir haben leider auch keine Idee, um dir helfen zu können. Ich persönlich kann zwar kein Java, aber auch jeder Java-Kundige hier um Forum wird dir nicht weiterhelfen können.

Warum nicht?

Woher sollen wir einschätzen können, was du falsch machst, wenn du mit keiner Fehlermeldung, keinem Beispieldatensatz und keinem Beispielcode herausrückst?

byte[] rawKey = generateRawKey();
Connection con = getConnection();        
        Statement statement = con.createStatement();
        statement.executeUpdate("INSERT INTO key(secretkey) VALUES('"+rawKey+"')");
        con.close();
        Connection con1 = getConnection();
        Statement stmt = con1.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);             
        ResultSet rs = stmt.executeQuery( "SELECT secretkey FROM Key order by id_key desc"); 
        con1.close();
        rs.first();
        byte[] rawKey2 = rs.getBytes(1);



 public static byte[] generateRawKey() throws Exception{       
        KeyGenerator kgen = KeyGenerator.getInstance("DES");
        kgen.init(56);
        SecretKey key = kgen.generateKey();
        return key.getEncoded();
    }

so ich lasse mir da quasi einen schlüssel generieren und in der Db in ein bytea feld speichern.

dann lass ich mir den key wieder aus der db in bytearray objekt auslesen und vergleiche den gespeicherte mit dem ausgelesen bytearray und in der konsole kommt so etwas raus:

Key in DB: -5+73+73+59+76±27+67+118+

Key aus DB: 91+66+64+49+57+56+57+102+56+52+

mein problem ist jetzt, es ist nicht dasselbe bytearray :frowning:

ich hoffe ich konnte das problem jetzt ein bisschen verständlicher machen, und vllt könnt ihr mit bei der lösung helfen.

aus diesem bytearray will ich nämlich einen key erzeugen, mit dem ich einen mit diesem key verschlüsselten string entschlüsseln kann.

mfg vino

Ich zitere mal aus der Dokumentation:

Entspricht der Key Deiner Wunschvorstellung, dass er so in der Datenbank steht oder hast Du diesen Wert z. B. per Command Line direkt aus der Datenbank gelesen?

Und wenn garnichts funktioniert sollte man doch mal die Doku lesen. Die gibt es hier. In Kapitel “7. Storing Binary Data” gibt es ein ausführliches Beispiel. Allerdings muss Du es für Deine Zwecke anpassen.


Ich habe es erst gerade gesehen:

Wenn Du dich beim SQL-Befehl “INSERT INTO” an die Syntax-Regeln gehalten hättest, würde auch Dein Java-Code funktionieren.


Und wenn Du den Zahlencode

in einen String umwandelst, wirst Du auch wissen, was Du wirklich gespeichert hast. Tiefgehende Java-Kenntnisse vorausgesetzt.



mfg

fristo

hmm danke erstmal für die dokumentation, hab ich bisher so nicht gefunden :slight_smile:

also mit einem preparedstatement hats jetzt funktioniert. jetzt läuft es wie gewünscht :slight_smile:

wo genau ist denn die SQL syntax bei dem INSERT INTO fehlerhaft?

ich bin eben noch ziemlicher anfänger, bei java sowie bei SQL.

in zukunft kann ich ja jetzt vorher die dokumentation durchforsten bevor ich hier fragen muss :wink:

mfg vino

Wenn du die Werte direkt in den Query einfügst, musst du deine Werte quoten, um sie als Text bereitzustellen. Siehe mein vorheriges Posting.

Wen du die Werte mittels Prepared Statements abschickst, werden sie 1:1 übernommen, weil nichts mehr geparst wird. Ausserdem sparst du dir böse Anfängerfehler wie SQL Injections.

So schwierig kann das doch nicht sein. Selbst hier in diesem Forum gibt es einen Beitrag zu deinen Problem: Startup für PostgreSQL + JDBC + Eclipse und am Ende des Beitrages gibt es auch einen Link auf die genannte Doku.



Prima. Eigentlich hatte ich erwartet, dass Du den Java-Code analysiert, damit Du deine Fehler erkennst. Mit den heutigen Entwicklungs-Werkzeugen kann man durch den Code steppen und man kann sich auch den Inhalt von Variable anzeigen lassen.



Der Syntax lautet doch:

INSERT INTO table VALUES ( { expression | DEFAULT } [, …] )

und definiert, dass man jeden Wert einzeln angeben muß und nicht eine Referenz auf “byte[] rawKey”. Und genau die hast Du in der Datenbank gespeichert. Das hättest Du auch feststellen können, indem Du den gelesenden Zahlen-Code in ein String umgewandeltst. Zudem hast Du mit PgAdmin ein Werkzeug mit dem Du dir jederzeit den Inhalt einer Tabelle anzuschauen kannst. Das ist auch recht einfach: Mit der Maus den Tabellennamen wählen ==> rechte Maustaste ==> Tabelle anzeigen. Was das Quoten von byta-Werten betrifft, gibt ein Kapitel über Arrays in der PostgreSQL Doku. Das solltest Du auch unbedingt lesen.




Daher ist es wichtig, die Doku zu lesen und bei auftretenen Problemen immer wieder nachzulesen.



Du hast es richtig erkannt. Und wenn man seine Fehler selbst findet, hat das auch den größten Lern-Effekt.



Nachdem Dein Java-Script in der neuen Fassung auch richtig funktioniert, solltest Du den Code hier veröffentlichen (einschließlich des Erzeugen der Tabelle in der Datenbank). Damit hilft Du in Zukunft anderen, die das gleiche Problem haben und entlastest uns.



mfg

fristo