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。
到目前为止我测试了什么(没有结果):
- upgrade/downgrade MySQL 连接器
- 添加
tinyInt1isBit=<true/1>
作为我的连接字符串的末尾
- upgrade/downgrade MySQL 数据库,总是有相同的数据转储我已经在源代码中得到了
- 还有很多我什至不记得的东西,因为我测试了很多东西:-/
现在我很确定问题出在 Tomcat 服务器使用的 MySQL JDBC 连接器上。因此,当我更改连接器的版本时,其他任何东西都无法正常工作(意思是,甚至无法连接用户)。
有什么想法吗?
编辑: 我忘了准确地说,在 java 应用程序的另一部分,存储为 DECIMAL
的数据请求返回为 java.lang.String
!这也是我要解决的一个大问题,但我认为两者是同一个原因。
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.Integer
和 DECIMAL
为java.lang.String
。所以我猜客户升级了它的 MySQL 生产连接器 Tomcat 而没有警告我。
总之,谢谢大家的建议。估计以后调试的时候会更仔细的看服务器日志:-)
我被困在一个庞大而古老的项目中(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。
到目前为止我测试了什么(没有结果):
- upgrade/downgrade MySQL 连接器
- 添加
tinyInt1isBit=<true/1>
作为我的连接字符串的末尾 - upgrade/downgrade MySQL 数据库,总是有相同的数据转储我已经在源代码中得到了
- 还有很多我什至不记得的东西,因为我测试了很多东西:-/
现在我很确定问题出在 Tomcat 服务器使用的 MySQL JDBC 连接器上。因此,当我更改连接器的版本时,其他任何东西都无法正常工作(意思是,甚至无法连接用户)。
有什么想法吗?
编辑: 我忘了准确地说,在 java 应用程序的另一部分,存储为 DECIMAL
的数据请求返回为 java.lang.String
!这也是我要解决的一个大问题,但我认为两者是同一个原因。
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, orjava.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.Integer
和 DECIMAL
为java.lang.String
。所以我猜客户升级了它的 MySQL 生产连接器 Tomcat 而没有警告我。
总之,谢谢大家的建议。估计以后调试的时候会更仔细的看服务器日志:-)