1. 程式人生 > >MySQL資料庫中tinyint型別欄位讀取資料為true和false

MySQL資料庫中tinyint型別欄位讀取資料為true和false

vertx jdbc 取myaql資料也存在這樣的問題,按照如下在進行sql語句編寫時候加上*1就i可以了

今天遇到這麼一個問題,公司最近在做一個活動,然後資料庫需要建表,其中有個欄位是關於獎勵發放的狀態的欄位,結果讀取出來的值為true

一、解決讀取資料為true/false的問題

場景:

  欄位:status (值為1,2,3)

  型別:tinyint  長度:1(有符號的)

  結果:查詢出來的資料列表,狀態值不管是1還是2還是3,都是"boolean true"

分析並解決:

  分析:由於MySql中沒有boolean型別,所以會用到tinyint[1]型別來表示,在mysql中boolean=tinyint[1]

  解決:tinyint型別長度的問題,當我把長度改成4時,查詢結果就正常了

猜想並使用新的方法解決:

  如果不改變型別的長度,怎麼讓查詢的結果正確呢?需要在查詢語句上面做修改了

  在你需要執行的sql語句中,把這個狀態欄位*1,結果就會得到資料庫存的值了(注意:記得加別名,不然查詢出來的就是status*1 => '1')

複製程式碼
SELECT
    id,
    name,
    status*1 AS status,
    add_time
FROM
    tableName
WHERE
    play_type = 0
複製程式碼

總結一下以上的兩種解決方法:

  1.修改tinyint型別的長度

  2.在查詢的sql語句上面做修改

二、擴充套件一下tinyint[1]

  關於tinyint[1]在官網裡邊有一段話:

  ?115,72005,72005

  Which would be the more optimzed way to store a boolean, TINYINT(1) or ENUM( 'true' , 'false')? It seems that when storing an enum w/ two settings should only take up one bit, 0 or 1, but would spend more time looking up the enums in the beginning of the query. tinyint(1) however would take up 4 bits assuming it ranged 0-9. So it seems if you just wanted to fetch the value, tinyint(1) would be faster, but if you are searching through lots of records enum('true','false') would be faster. Do you concur??

  翻譯過來如下:

    TINYINT(1)或ENUM('真','假')?

    用ENUM列舉當儲存只有2個值時只佔用一個位的寬度,0或1,但會花更多的時間去尋找了列舉查詢的開始。

    用TINYINT(1)預設就會佔用4個位的寬度(0000)

    得出結論:

      比如要儲存一個介於0-9之間的值,為了查詢獲取這個值,建議用TINYINT(1)會更快,

           但如果你是為了大量記錄列舉(“真”,“假”),那麼用ENUM( 'true' , 'false') 搜尋會更快。

  所以由這裡可以看出,當你使用tinyint[1]來儲存超過0,1兩個值以外的值,比如儲存2,那這個2就是髒資料,tinyint[1]只適用於儲存0和1兩個值,也即真和假,true和false

  一般的,咱們如果存的是純數字的話,建議用tinyint,如果是字串,且是固定長度的,建議用char,而enum的列舉欄位,使用的使用需要慎重考慮,避免帶來不必要的麻煩