您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關怎么在mysql中返回Boolean類型,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
select id='22aa' from mytest where age=202 返回1 可封裝為true select count(*)=1 from mytest where age=202 返回1 可封裝為true select count(*)=0 from mytest where age=202 返回0 可封裝為false select count(*)<3 from mytest where age=202 返回1 可封裝為true select count(*)<=1 from mytest where age=202 返回1 可封裝為true select name="aa" from mytest where age=10 當name為null時,sql不會報錯,返回結(jié)果也為nul,參照第二種情況的sql 3 代碼會報錯
總結(jié):
這種情況類似于java中的判斷語句。只是java中=是賦值的意思,所以用了==來做判斷,而mysql中賦值用set,判斷就直接用=。
select enable from mytest where age=202 返回1 可封裝為true select count(*) from mytest 返回4 可封裝為Boolean類型,但為false select enable from mytest where age=201 返回null 不可封裝為Boolean類型,代碼會直接報錯 select id from mytest where age=202 返回'22aa' 可封裝為Boolean類型,但為false select id from mytest where age=202 返回'true' 可封裝為Boolean類型,但為true select id from mytest where age=202 返回'false' 可封裝為Boolean類型,false //特殊情況 select * from mytest 報錯Expected one result (or null) to be returned by selectOne(), but found: 4 select * from mytest where age=202 返回一組數(shù)據(jù)false 2019-08-28 202 15 1 ,可以封裝為false select * from mytest where age=202 返回一組數(shù)據(jù)true 2019-08-28 202 15 1 ,可以封裝為true select * from mytest where age=202 返回一組數(shù)據(jù)aaaa2019-08-28 202 15 1 ,可以封裝為false
總結(jié):
Mybatis是根據(jù)查詢到的記錄數(shù)進行轉(zhuǎn)換的(1=true,0=false)
需要注意的地方:如果查詢到多條記錄(大于1),返回的卻是false, 這時就與我們的期望的剛好相反。這里,可以換其它方法,可以通過返回記錄數(shù),進行判斷,也可以保證記錄在數(shù)據(jù)庫是唯一的。也可以直接用第一種情況解決。
根據(jù)第4、5、6條sql語句的測試,如果字符串是"true",就可以封裝為true,如果為"false"就可以封裝為false,其他情的字符串都為false。
(猜測,并不準確,需要到mysql官網(wǎng)上來查,如果返回的字段是字符串,將其轉(zhuǎn)為Boolean時是按什么規(guī)則轉(zhuǎn)換的,猜測是類似于java中的字符串轉(zhuǎn)Boolean方法:Boolean.valueOf(“aaa”) //false,該方法如下)
至于8、9、10的sql返回一組,而接受數(shù)據(jù)的只要一個時的情況,為什么就取了id的值來封裝,有待繼續(xù)研究。
MySQL中,Boolean只是 tinyint(1) 的別名,也就是說,MySQL中并沒有真正的bool類型。而SQLAlchemy生成SQL的時候并沒有檢測到 這一點,這就導致一個問題,當使用 bool 類型作為查詢條件時,用不上索引,從而導致掃表的行為:
> SELECT COUNT(*) FROM message WHERE message.is_national = 1 AND message.updated_at > '2020-01-01 00:00:00' AND message.deleted_at IS NULL; +----------+ | COUNT(*) | +----------+ | 0 | +----------+ 1 row in set Time: 0.018s > SELECT COUNT(*) FROM message WHERE message.is_national is true AND message.updated_at > '2020-01-01 00:00:00' AND message.deleted_at IS NULL; +----------+ | COUNT(*) | +----------+ | 0 | +----------+ 1 row in set Time: 2.162s
注意觀察第一行和第二行的時間,很明顯第二行沒有用上索引,我們來看看 EXPLAIN 的結(jié)果便知道了:
> EXPLAIN SELECT COUNT(*) FROM message WHERE message.is_national = 1 AND message.updated_at > '2020-01-01 00:00:00' AND message.de leted_at IS NULL; | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | | 1 | SIMPLE | message | ref | ix_message_updated_at,idx_updated_at_is_national,ix_message_is_national | ix_message_is_national | 1 | const | 1 | Using where | > EXPLAIN SELECT COUNT(*) FROM message WHERE message.is_national is true AND message.updated_at > '2020-01-01 00:00:00' AND messag e.deleted_at IS NULL; | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | | 1 | SIMPLE | message | ALL | ix_message_updated_at,idx_updated_at_is_national | <null> | <null> | <null> | 一個很大的數(shù)字 | Using whe re |
看完上述內(nèi)容,你們對怎么在mysql中返回Boolean類型有進一步的了解嗎?如果還想了解更多知識或者相關內(nèi)容,請關注億速云行業(yè)資訊頻道,感謝大家的支持。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。