2、yaml配置檔案當中的坑(數字的定義和支援進制書寫格式)
阿新 • • 發佈:2022-05-29
6、進位制數的轉換
6.1、問題回顧
- 我記得我剛剛開始使用SpringBoot的時候,有一天在做到SpringBoot整合第三方技術的時候
- 我剛好在那天學習到整合Mybatis,做Web專案嘛,不連資料庫怎麼行?
- 在yml配置檔案當中配置資料來源--datasource的時候,我遇見了一個問題
- 我個人有做筆記的習慣嘛,我喜歡寫一步做一步,在那天這個錯誤的資訊被我留存下來了
- 這就是我當時配置資料來源的配置,我遇到了一個問題,我死活都連不上資料庫
- 我通過cmd終端連線我的資料庫,沒問題
- 通過圖形介面化工具Navicat連線也沒問題
- 但是就是使用SpringBoot配置我的資料庫連線的時候,連不上,密碼是錯的
- 我很鬱悶,但是那天我也找到了問題的所在,只是我不明白為什麼會出現這個問題
6.2、問題覆盤
- 我將原先的demo給大家來複個盤
- 這是咱的yml配置檔案,我現在將它(password)設定為int型別的
- 同時,這裡有個實體test,我讓他來讀取我這個配置檔案當中的值
- 接下來,咱們開始列印輸出測試一下結果,看看發生了什麼事情?
- 我明明寫的是 010115,為什麼打印出來是4173呢?
6.3、問題出現的原因
上述這種情況,其實任何開發人員都有可能遇見的,所以這裡需要提一下
- 在我們學習yaml語法規則的時候
- 資訊量不大,但是有幾個資訊容易忽略
-
int值支援,二進位制,八進位制,十六進位制
- 二進位制是什麼:0b1010_0111_1010_1110,這種型別的
- 八進位制的語法:以0開頭,後面跟上(0-7)=>0 (0-7)=>0(10115)
- 十六進位制呢:0x開,(0-9,a-f)跟
我們開啟計算器,測試一下,為什麼010115 會變成 4173呢?
- 現在明白了吧,我的密碼剛好是以0開頭的,然後又恰好後面的數字都只包含0-7,他是一個標準的八進位制,才會在八轉十的時候遇見這個問題
- 只能說太倒黴加上太巧了,但凡密碼不是以0開頭的都不至於這樣,當然,如果是0x開的那遇到了也沒轍對吧
- 那麼他的隱藏性主要在哪裡?
6.4、問題的隱藏性
- 我們後臺接受資料的時候,password是按照字串來接收的
- 他識別到了0開的資料(0(010115))以後,並且又是一個純數字,他預設把它按照數值進行解析=>八進位制轉十進位制
- 轉換完畢得到結果了=>4175,那直接將其轉換為字串即可,從而注入到我們的實體類配置項當中
- 最終就出現了我們這麼一個問題
6.5、總結
- 像我們這個問題最終引發的後果就是,連不上資料庫,其實和連資料庫有關係嗎?沒有關係?
- 就是因為這個地方的格式轉化問題,你能賴別人嗎?
- 人家SpringBoot都推薦了,如果是純數字結構的,那麼你用字串給他包上就行了
- 我們這裡
- 恰巧沒用字串包上、
- 恰巧又剛好是一個八進位制,這個八進位制被轉換成十進位制了、
- 恰巧,轉化出來的密碼又剛好可以和String型別時配上、
- 恰巧,轉化出來的十進位制密碼跟你資料庫當中的密碼完全不一樣、
- 恰巧,你連不上資料庫