3

我有一个用 java 编写的 servlet/tomcat 服务器。

我有一个我编写的 mysql 类,我一直在使用其中的函数将准备好的语句插入到使用 jdbc 的 mysql 数据库中。

我调用的函数java.sql.PreparedStatement.setString用于设置准备好的语句的参数。这已经连续几个月完美地适用于数千种不同的输入,没有问题。

然而,最近,当尝试使用该函数将 ip 地址插入 VARCHAR 类型的 mysql 列时,我收到如下异常抛出:

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

这很奇怪,在我的代码中任何地方都没有 DOUBLE 的概念,mysql 表上的“显示列”确保数据类型实际上是 VARCHAR。我让我的同事也查看了这个,以仔细检查我没有遗漏一些简单的东西。然而我们都被难住了。

我唯一的理论是 JDBC 驱动程序或 SetText 函数冒昧并假设 DOUBLE 数据类型,因为 IP 地址的第一部分采用 XX.XX 的形式

任何帮助都会很棒,请不要告诉我做明显的事情,比如检查我的列数据类型等。我花了很多时间检查所有内容。

4

1 回答 1

10

问题不在于 JDBC 驱动程序。问题出在 MySQL 上。这是我在 MySQL commadline 上得到的:

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而不是使用,(comma)。所以查询应该是:

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 回答