簡體   English   中英

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),我需要在工作中安裝一個新的開發環境。

我有一個可由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返回! 這也是我必須解決的主要問題,但我認為兩者是同一個原因。

Connector / J文檔

MySQL類型名稱: TINYINT

GetColumnClassName的返回值: TINYINT

返回的Java Class: java.lang.Boolean ,如果配置屬性tinyInt1isBit設置為true(缺省值)和存儲大小為1,或者java.lang.Integer如果不是。

請注意:否則為java.lang.Integer 檢查屬性tinyInt1isBit並可能對其進行更改。

如果您已經嘗試過,請嘗試重新啟動mysql服務器。

因此,經過一周的工作,我設法找到了解決方案。 當心,這有點愚蠢。

當我以為MySQL連接器是問題的根源時,我是對的。 我決定重試直到今天為止為解決該問題所進行的所有嘗試,因此我對連接器進行了少許升級(從v3.0.11升級到v3.1.14)。 然后,我重新啟動了有問題的數據庫請求,並發現了以前在Tomcat日志中沒有看到的ERROR日志:指定的數據庫名稱不正確(類似於myDB\\?autoReconnect=true... )。 確實,在連接參數部分之前錯誤地插入了\\

我從連接字符串中刪除了有罪的\\ ,重新啟動了Tomcat,然后... tadaaa! 我的問題解決了!

但是,我確實使用舊的MySQL連接器(v3.0.11)進行了測試,它仍然以TITANINT TINYINT(1)作為java.lang.IntegerDECIMAL作為java.lang.String 因此,我猜想客戶端會在沒有警告我的情況下升級其生產Tomcat上的MySQL連接器。

無論如何,謝謝大家的建議。 猜猜我將來調試時會更仔細地閱讀服務器日志:-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM