1. 程式人生 > 其它 >2、yaml配置檔案當中的坑(數字的定義和支援進制書寫格式)

2、yaml配置檔案當中的坑(數字的定義和支援進制書寫格式)

6、進位制數的轉換

6.1、問題回顧

  1. 我記得我剛剛開始使用SpringBoot的時候,有一天在做到SpringBoot整合第三方技術的時候
  2. 我剛好在那天學習到整合Mybatis,做Web專案嘛,不連資料庫怎麼行?
  3. 在yml配置檔案當中配置資料來源--datasource的時候,我遇見了一個問題
    • 我個人有做筆記的習慣嘛,我喜歡寫一步做一步,在那天這個錯誤的資訊被我留存下來了
  4. 這就是我當時配置資料來源的配置,我遇到了一個問題,我死活都連不上資料庫
    • 我通過cmd終端連線我的資料庫,沒問題
    • 通過圖形介面化工具Navicat連線也沒問題
    • 但是就是使用SpringBoot配置我的資料庫連線的時候,連不上,密碼是錯的
  5. 我很鬱悶,但是那天我也找到了問題的所在,只是我不明白為什麼會出現這個問題

6.2、問題覆盤

  1. 將原先的demo給大家來複個盤
    • 這是咱的yml配置檔案,我現在將它(password)設定為int型別
    • 同時,這裡有個實體test,我讓他來讀取我這個配置檔案當中的值
  2. 接下來,咱們開始列印輸出測試一下結果,看看發生了什麼事情?
  3. 我明明寫的是 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型別時配上、
    • 恰巧,轉化出來的十進位制密碼跟你資料庫當中的密碼完全不一樣、
    • 恰巧,你連不上資料庫