# Prepared Statement scheint nicht zu funktionieren



## plichel (11. Jan 2006)

Hallo zusammen,

seit ein paar wochen hab ich nen Ubuntu 5.1. Darauf läuft ne MySQL Datenbank (4.1.12) auf die ich von Java (1.5, Compiler-kompatibiltät aber 1.4) aus zugreife. Dabei habe ich folgendes Problem:

Scheinbar wird ein INSERT, wenn es als Prepared Statement ausgeführt wird, nicht korrekt  abgearbeitet, da folgender
Code


```
String sql_test="INSERT INTO test (fvarchar,fchar,fint,flong) VALUES ('string','test',100,100)";
    	String sql_test_ps="INSERT INTO test (fvarchar,fchar,fint,flong) VALUES (?,?,?,?)";
    	
    	this.connect();
    	this.ps=conn.prepareStatement(sql_test);
    	System.out.println(ps.toString());
    	this.ps.execute();
    	
    	
    	this.ps=conn.prepareStatement(sql_test_ps);
    	this.ps.setString(1,"string1");
    	this.ps.setString(2,"test");
    	this.ps.setInt(3,100);
    	this.ps.setInt(4,100);
    	System.out.println(ps.toString());
    	this.ps.execute();
```

komischerweise das folgende Resultat bringt:


mysql> select * from test;
+----------+-------+----------+-----------+
| fvarchar | fchar | fint     | flong     |
+----------+-------+----------+-----------+
| string   | test  |      100 |       100 |
|          | \uffff     | 50396416 | 117441280 |
+----------+-------+----------+-----------+
2 rows in set (0.00 sec)


Jemand ne idee ?

gruss,
plichel


----------



## plichel (11. Jan 2006)

ANMERKUNG:

Also das Problem ist, dass das Ergbnis des INSERTS mit Prepared Statement nicht den gewünschten Datensatz einfügt sondern irgendwas anderes:

Die erste Zeile ist ohne Prepared Statement (alles schick) die zweite mit. (die Werte der zweiten Zeile haben wenig mit der ursprünglichen Query zu tun) (Ausgabe der mysql-konsole


```
mysql> select * from test;
+-----------+-----------+--------------+----------------+
| fvarchar | fchar      | fint             | flong             |
+-----------+-----------+--------------+----------------+
| string     | test        |  100            |  100              |
|                 | \uffff       | 50396416 | 117441280 |
+-----------+-----------+--------------+-----------------+
2 rows in set (0.00 sec)
```


(der Wert  \ufff wurde in der mysql-konsole als kästchen dargestellt)


----------



## Bleiglanz (11. Jan 2006)

welchen JDBC Treiber hast du?


----------



## plichel (11. Jan 2006)

mysql-connector-java-3.1.8-bin.jar hab ich eingebunden


----------



## plichel (11. Jan 2006)

treiberklasse: com.mysql.jdbc.Driver


----------



## Bleiglanz (11. Jan 2006)

mach mal ein ps.close() rein bevor du weiterarbeitest, daran liegts aber vermutlich nicht

irgendwas in der datenbank-URL komisch?

was macht this.connect()?

sonst seh ich jetzt auch keinen Fehler...


----------



## plichel (11. Jan 2006)

schonmal danke dass du ich mit dem problem beschäftigst...

nur leider hab ich diese sachen auch schon vergeblich gecheckt. zudem sollte ich erwähnen, dass der code auf einem suse9.?, schonmal ordentlich funktioniert hat. dies würde dann eigentlich nahelegen, dass irgendwelche konfigurations-sachen nicht korrekt eingestellt sind. hält es jemand für möglich dass das problem an mysql oder sonstwo ausserhalb java liegt ? wäre ja eigentlich quatsch, da ja die query ohne prep. stat. korrekt arbeitet und es auch früher schon mal lief.

aber trotzdem mal noch der restliche code.


```
protected String dbClass = "com.mysql.jdbc.Driver";
protected static String dbUrl = "jdbc:mysql://localhost/dbname";

private void connect() throws Exception {

    	Class.forName(this.dbClass).newInstance(); 
        try {
        	this.conn = DriverManager.getConnection(dbUrl, "user", "pwd");
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }
```


----------



## Bleiglanz (11. Jan 2006)

schmeiss mal das logging an (my.cnf) und schau, welchen SQL Befehl dein Programm tatsächlich schickt...


----------



## plichel (11. Jan 2006)

ok habs angestellt. hier sieht man dann auch, dass mysql schon die "abgewandelte" query ausführt:

auszug aus mysql.log:


```
...
                      
                      8 Connect     root@localhost on dbname
                      8 Query       SET NAMES latin1
                      8 Query       SET character_set_results = NULL
                      8 Query       SHOW VARIABLES
                      8 Query       SHOW COLLATION
                      8 Query       SET autocommit=1
                      8 Prepare     [1] INSERT INTO test (fvarchar,fchar,fint,flong) VALUES ('string','test',100,100)
                      8 Execute     [1] INSERT INTO test (fvarchar,fchar,fint,flong) VALUES ('string','test',100,100)
                      8 Prepare     [2] INSERT INTO test (fvarchar,fchar,fint,flong) VALUES (?,?,?,?)
                      8 Execute     [2] INSERT INTO test (fvarchar,fchar,fint,flong) VALUES ('','\uffff',50396416,117441280)
```


----------



## Bleiglanz (11. Jan 2006)

PFF Treiber kaputt

http://dev.mysql.com/doc/connector/j/en/cj-changelog.html

schau mal ob man das benutzen des "serverseitigen" PreparedStatement irgendwie abschalten kann...?!


----------



## plichel (12. Jan 2006)

kannst du vielleicht nochmal kurz sagen was ein PFF treiber ist, wozu er da ist und waran du gesehen hast dass dieser nicht funktioniert ! hab mal gegoogelt und das eine resultat hatte nichts mit mysql oder java zu tun gehabt...


----------



## plichel (12. Jan 2006)

die zeile: useServerPrepStmts=true war sowieso schon auskommentiert. wenn ich sie aktiviere dann kennt das mysql gar
nicht:

```
060112  9:29:07 [ERROR] mysqld: unknown variable 'useServerPrepStmts=true'
```


----------



## Bleiglanz (12. Jan 2006)

PFF sollte nur luftablassen 

ist klar dass der Treiber hier einen BUG hat, weil ja ein falscher SQL Befehl übergeben wird

entweder du besorgst dir wirklich den allerneuesten

( oder einen älteren, der von den serverseitigen PrepStatements nichts weiss ...)

oder man kann das in der Connection URL abschalten ?


----------



## Bleiglanz (12. Jan 2006)

gerade heute übern ticker gekommen



> PreparedStatement.setString() didn't work correctly when
> sql_mode on server contained NO_BACKSLASH_ESCAPES, and no characters
> that needed escaping were present in the string



http://dev.mysql.com/doc/refman/5.0/en/cj-changelog.html


----------



## plichel (12. Jan 2006)

DANKE für die Hilfe !!

ich habs jetzt mit nem älteren treiber wieder zum laufen bekommen (mysql-connector-java-3.0.17-ga)

kann zwar damit nicht so richtig zu frieden sein, aber ist mir jetzt erstma ziehmlich hosenträger. hauptsache es läuft...

wg "PFF Treiber" : man klammert sich dann halt an jeden strohhalm...


----------

