3

Javaで記述されたサーブレット/Tomcatサーバーがあります。

私は自分が書いたmysqlクラスを持っており、その中の関数を使用して、jdbcを使用してプリペアドステートメントをmysqlデータベースに挿入しています。

私が呼び出す関数java.sql.PreparedStatement.setStringは、プリペアドステートメントのパラメーターを設定するために使用します。これは、何千もの異なる入力に対して何ヶ月も問題なく完全に機能しています。

ただし、最近、関数を使用してVARCHARタイプのmysql列にIPアドレスを挿入しようとすると、次のように例外がスローされます。

com.mysql.jdbc.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLE value: '10.1.1.101'

これは奇妙なことです。私のコードのどこにもDOUBLEの概念はなく、mysqlテーブルの「ShowColumns」はデータ型が実際にVARCHARであることを保証します。私は同僚にもこれを見てもらい、単純なものを見逃していないことを再確認しました。しかし、私たちは皆困惑しています。

私の唯一の理論は、IPアドレスの最初の部分がXX.XXの形式であるため、JDBCドライバーまたはSetText関数が自由を取り、DOUBLEデータ型を想定しているというものです。

どんな助けでも素晴らしいでしょう、私の列のデータ型をチェックするなどの明白なことをするように私に言わないでください。私はすべてをチェックするのに2倍と3倍の時間を費やしました。

4

1 に答える 1

10

問題は JDBC ドライバーにはありません。問題は MySQL にあります。MySQLコマンドラインで得られるものは次のとおりです。

mysql> INSERT INTO route_table (SYSTEM, IP, PORT) VALUES ("192.168.1.24:8080","192.168.1.24","8080") ON DUPLICATE KEY UPDATE IP=values(IP) AND PORT=values(PORT);
Query OK, 1 row affected (0.04 sec)

mysql> INSERT INTO route_table (SYSTEM, IP, PORT) VALUES ("192.168.1.24:8080","192.168.1.24","8080") ON DUPLICATE KEY UPDATE IP=values(IP) AND PORT=values(PORT);
ERROR 1292 (22007): Truncated incorrect DOUBLE value: '192.168.1.24'
mysql>

問題は、使用されている の構文INSERT INTO .... ON DUPLICATE KEY UPDATEが正しくないことです。(カンマ)ANDを使用する代わりにキーワードを使用しました。したがって、クエリは次のようになります。,

mysql> INSERT INTO route_table (SYSTEM, IP, PORT) VALUES ("192.168.1.24:8080","192.168.1.24","8080") ON DUPLICATE KEY UPDATE IP=values(IP), PORT=values(PORT);
Query OK, 2 rows affected (0.00 sec)
于 2012-11-07T12:24:00.303 に答える