因爲MySql中沒有boolean類型,因此會用到tinyint[1]類型來表示

今天遇到這麼一個問題,公司最近在作一個活動,而後數據庫須要建表,其中有個字段是關於獎勵發放的狀態的字段,結果讀取出來的值爲truemysql

1、解決讀取數據爲true/false的問題sql

場景:數據庫

  字段:status (值爲1,2,3)fetch

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

  結果:查詢出來的數據列表,狀態值無論是1仍是2仍是3,都是"boolean true"翻譯

分析並解決:字符串

  分析:因爲MySql中沒有boolean類型,因此會用到tinyint[1]類型來表示,在mysql中boolean=tinyint[1]it

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

猜測並使用新的方法解決:ast

  若是不改變類型的長度,怎麼讓查詢的結果正確呢?須要在查詢語句上面作修改了

  在你須要執行的sql語句中,把這個狀態字段*1,結果就會獲得數據庫存的值了(注意:記得加別名,否則查詢出來的就是status*1 => '1')

複製代碼

SELECT
    id,
    name,
    status*1 AS status,
    add_time
FROM
    tableName
WHERE
    play_type = 0

複製代碼

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

  1.修改tinyint類型的長度

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

2、擴展一下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的枚舉字段,使用的使用須要慎重考慮,避免帶來沒必要要的麻煩

相關文章
相關標籤/搜索