java.sql.PreparedStatement.setString函数将varchar与double混淆
我有一个用java编写的servlet/tomcat服务器 我编写了一个mysql类,我一直在使用其中的函数使用jdbc将准备好的语句插入mysql数据库 我调用的函数使用java.sql.PreparedStatement.setString函数将varchar与double混淆,java,mysql,tomcat,jdbc,Java,Mysql,Tomcat,Jdbc,我有一个用java编写的servlet/tomcat服务器 我编写了一个mysql类,我一直在使用其中的函数使用jdbc将准备好的语句插入mysql数据库 我调用的函数使用java.sql.PreparedStatement.setString来设置准备好的语句的参数。这已经连续几个月完美地为数千种不同的输入工作,没有任何问题 但是,最近,当尝试使用该函数将ip地址插入VARCHAR类型的mysql列时,引发了一个异常,如下所示: com.mysql.jdbc.MysqlDataTruncati
java.sql.PreparedStatement.setString
来设置准备好的语句的参数。这已经连续几个月完美地为数千种不同的输入工作,没有任何问题
但是,最近,当尝试使用该函数将ip地址插入VARCHAR类型的mysql列时,引发了一个异常,如下所示:
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLE value: '10.1.1.101'
这很奇怪,我的代码中没有DOUBLE的概念,mysql表上的“Show Columns”确保数据类型实际上是VARCHAR。我让我的同事也仔细检查了一下,我没有遗漏一些简单的东西。然而,我们都被难住了
我唯一的理论是JDBC驱动程序或SetText函数正在冒昧地使用双数据类型,因为ip地址的第一部分是XX.XX的形式
任何帮助都是很好的,请不要告诉我做一些明显的事情,比如检查我的列数据类型等。我花了很多时间反复检查所有内容。问题不在于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的语法。。。。在重复密钥更新时,您使用的
不正确。您使用了关键字和
,而不是,
(逗号)。因此,查询应该是:
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)
您是否更新了任何内容(MySQL、驱动程序等)?不,我没有介绍任何新内容,只是在其中插入了不同类型的数据。您可以发布代码吗?您的代码中可能缺少引号。
PreparedStatement
的ParameterMetaData
作为列类型报告了什么?什么是查询?如何设置参数?@sunleo您指的是查询中问号周围的引号吗?我不认为这是正确的。我的查询是:INSERT-INTO-route_表(系统、IP、端口)中重复密钥更新IP=?端口=?
@FaddishWorm:注释中隐藏了实际有问题的代码这一事实可能没有帮助。以后,请在问题开始时包含您的SQL(或任何相关代码)。看见