Mysql-tinyint使用之實際採坑記

使用tinyint(1) 用來存儲枚舉時候的坑

場景描述:java

公司某個系統分別在dev,test等多個環境進行部署,可是某一天在聯調過程當中發現dev環境的不少地方的枚舉值沒法正常顯示 均爲null。可是在其餘多個環境,均能正常顯示。有點懵逼,而後開啓排查模式ing....mysql

問題排查spring

  1. 保證在dev,test環境發佈一樣的分支sql

    結果:test環境ok,dev環境任然異常-->排除代碼問題數據庫

  2. 在dev環境,本地 使用同一個數據庫查詢運維

    結果:本地環境ok,dev環境任然異常-->排除數據問題學習

  3. 找運維臨時開放遠程debug端口url

    本地遠程debug,果然枚舉顯示null異常--->肯定是開發環境的問題spa

    3.1 去私服上下載剛打包的項目jar 本地引用後使用debug

    結果:顯示正常 -->排除部署的jar包問題

    3.2 去開發環境機器上獲取相關配置文件進行對比

    結果:配置文件存在差別。修復差別後從新部署 ->dev環境顯示正常

 

問題出現的根源:原先我司xxx系統是dev,test 將相關的配置文件打包至jar中,使用項目中的配置文件。最近由運維團隊統一管理配置文件。運維小夥伴在維護dev配置文件時候,dev相關的配置未與代碼中保持一致(dev環境缺乏 tinyInt1isBit=false)。

過後詳細學習下tinyInt1isBit=false 的做用

JAVA數據類型 和 MYSQL的數據類型轉換,要注意tinyInt 類型,且存儲長度爲1的狀況。

先看下mysql官網的介紹

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.

tinyInt(1) 只用來表明Boolean含義的字段,且0表明False,1表明True。若是要存儲多個數值,則定義爲tinyInt(N), N>1。例如 tinyInt(2)

項目中須要使用枚舉時候(0:默認,1:成功,2:失敗,3:異常,4:未知錯誤...),有兩種方式能夠正常展現枚舉

方式1:

JDBC的URL增長 tinyInt1isBit=false參數,注意參數名區分大小寫,不然不生效

jdbc:mysql://${ucmha.proxy1_2.host}/${db.mysql.db}?tinyInt1isBit=false

方式2:

必定要用tinyint就增長長度(tinyInt(N), N>1 好比tinyint(4))

實測分析

場景1:tinyInt1isBit 使用默認值true and 使用tinyint(1)

#alter table tableA add COLUMN  `return_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '狀態(0未審批 1審批經過 2審批拒絕 3 拒絕失敗 4 拒絕中)';
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useAffectedRows=true

會發現實際java代碼中查詢實體後,對於枚舉值的展現均出現異常,顯示爲 null

 場景2:tinyInt1isBit 使用false and 使用tinyint(1)

#alter table tableA add COLUMN  `return_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '狀態(0未審批 1審批經過 2審批拒絕 3 拒絕失敗 4 拒絕中)';
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&tinyInt1isBit=false&useAffectedRows=true

可正常顯示枚舉

場景3:tinyInt1isBit 使用默認值true and 使用tinyint(n) (n>1)

#alter table tableA add COLUMN  `return_type` tinyint(2) NOT NULL DEFAULT '0' COMMENT '狀態(0未審批 1審批經過 2審批拒絕 3 拒絕失敗 4 拒絕中)';
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useAffectedRows=true

tinyint(n) (n>1) 可正常顯示枚舉

相關文章
相關標籤/搜索