MySQL TINYINT(1) 神秘地映射到 Java 类型 Integer

MySQL TINYINT(1) mysteriously mapped to Java type Integer

我被困在一个庞大而古老的项目中(j2sdk 1.4.2,Tomcat 4.1.29,MySQL 5.0.51a),我需要为其安装一个新的开发环境工作。

我有一个 MySQL 数据库,我的 Tomcat 可以访问它,它处理来自我的 Java 应用程序的请求。在该数据库中,一些表包含我的应用程序所需的布尔值。

因此,在应用程序中,创建了一个准备好的语句,向其中添加了参数,然后启动请求并将此请求的结果集存储在自定义 SQLResult 对象(即我公司制作的自定义框架的一部分,对此无能为力——尽管它与经典的 java.sql.ResultSet 对象非常相似)。

这里的问题是:当 java 应用程序请求一些数据作为 TINYINT(1) 存储在数据库中时,这些数据作为 java.lang.Integer 返回给 java 应用程序],而不是 java.lang.Boolean,正如我所愿。

注意:Tomcat服务器使用的JDBC连接器版本是mysql-connector-java-3.0.11-stable。

到目前为止我测试了什么(没有结果):

现在我很确定问题出在 Tomcat 服务器使用的 MySQL JDBC 连接器上。因此,当我更改连接器的版本时,其他任何东西都无法正常工作(意思是,甚至无法连接用户)。

有什么想法吗?

编辑: 我忘了准确地说,在 java 应用程序的另一部分,存储为 DECIMAL 的数据请求返回为 java.lang.String!这也是我要解决的一个大问题,但我认为两者是同一个原因。

来自Connector/J documentation

MySQL Type Name: TINYINT

Return value of GetColumnClassName: TINYINT

Returned as Java Class: java.lang.Boolean if the configuration property tinyInt1isBit is set to true (the default) and the storage size is 1, or java.lang.Integer if not.

请注意:或者 java.lang.Integer 如果不是。检查 属性 tinyInt1isBit 并可能更改它。

如果您已经这样做,请尝试重新启动 mysql 服务器。

所以,经过整整一周的工作,我设法找到了解决方案。当心,那有点愚蠢。

当我认为 MySQL 连接器是我的问题根源时,我是对的。我决定重试直到今天我尝试过的所有方法来解决这个问题,所以我稍微升级了连接器(从 v3.0.11 到 v3.1.14)。然后我重新启动了有问题的数据库请求,并注意到我之前在 Tomcat 日志中没有看到的 ERROR 日志:指定的数据库名称不正确(类似于 myDB\?autoReconnect=true...)。实际上,在连接参数部分之前错误地插入了 \

我从连接字符串中删除了有罪的 \,重新启动了我的 Tomcat,然后... tadaaa!我的问题解决了!

但是,我确实使用旧的 MySQL 连接器 (v3.0.11) 进行了测试,它仍然 returns TINYINT(1)java.lang.IntegerDECIMALjava.lang.String。所以我猜客户升级了它的 MySQL 生产连接器 Tomcat 而没有警告我。

总之,谢谢大家的建议。估计以后调试的时候会更仔细的看服务器日志:-)