今天遇到這么一個問題,公司最近在做一個活動,然后數據庫需要建表,其中有個字段是關於獎勵發放的狀態的字段,結果讀取出來的值為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的枚舉字段,使用的使用需要慎重考慮,避免帶來不必要的麻煩
