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