【问题标题】:MySQL TINYINT(1) mysteriously mapped to Java type IntegerMySQL TINYINT(1) 神秘映射到 Java 类型 Integer
【发布时间】:2015-11-20 11:07:33
【问题描述】:

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

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

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

问题是:当 java 应用程序请求一些存储在数据库中的数据为TINYINT(1) 时,这些数据会以java.lang.Integer 而不是java.lang.Boolean 的形式返回给 java 应用程序,就像我想的那样。

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

到目前为止我测试的内容(没有结果):

  • 升级/降级 MySQL 连接器
  • 添加tinyInt1isBit=<true/1>作为我的连接字符串的结尾
  • 升级/降级 MySQL 数据库,始终使用与源代码一起提供的相同数据转储
  • 还有很多其他的东西我什至不记得了,因为我测试了很多东西:-/

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

有什么想法吗?

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

【问题讨论】:

  • 您说“返回到 Java 应用程序”,但如果您没有使用标准的ResultSet,听起来您的自定义代码正在准确识别 TINYINT 列并将其视为数字类型.
  • 听起来你需要为这种情况创建一个解决方法帮助程序类...
  • @Jordi Castilla:不幸的是,我还不能添加任何代码,因为这段代码应该可以正确运行(因为它已经在生产环境中运行了好几年了)。目前,我的目标是重新创建一个稳定的开发环境,让一切都尽可能顺利地运行,并且无需修改任何代码。这就是为什么我认为连接器可能是导致错误的原因。但我不知道为什么:-/

标签: java tomcat mysql-connector


【解决方案1】:

来自Connector/J documentation

MySQL 类型名称: TINYINT

GetColumnClassName 的返回值: TINYINT

作为 Java 类返回: java.lang.Boolean 如果配置属性 tinyInt1isBit 设置为 true(默认值)并且存储大小为 1,否则返回 java.lang.Integer

请注意:或java.lang.Integer 否则。检查属性tinyInt1isBit 并可能更改它。

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

【讨论】:

  • 感谢您的回复 :-) 但我已经检查过,实际上两次;我使用的 MySQL DB 没有特别配置,所以 tinyInt1isBit 应该已经设置为 true;无论如何,我尝试手动设置它,没有观察到任何变化。
【解决方案2】:

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

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

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

但是,我使用旧的 MySQL 连接器 (v3.0.11) 进行了测试,它仍然以 java.lang.Integer 的形式返回 TINYINT(1),以 java.lang.String 的形式返回 DECIMAL。所以我猜客户端在没有警告我的情况下升级了它的生产 Tomcat 上的 MySQL 连接器。

无论如何,谢谢大家的建议。我想我以后调试时会更仔细地阅读服务器日志:-)

【讨论】:

  • 根据documentation,您观察到的内容是有意义的。在连接器的 v3.0.16 中添加了 tinyInt1isBit 属性。
猜你喜欢
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 2013-08-09
  • 2014-11-20
  • 1970-01-01
  • 2018-06-21
  • 2018-12-13
  • 1970-01-01
相关资源
最近更新 更多