亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

淺談mysql返回Boolean類型的幾種情況

瀏覽:3日期:2023-10-02 09:49:24
mysql返回Boolean類型

淺談mysql返回Boolean類型的幾種情況

第一種情況,直接返回

select id=’22aa’ from mytest where age=202 返回1 可封裝為trueselect count(*)=1 from mytest where age=202 返回1 可封裝為trueselect count(*)=0 from mytest where age=202 返回0 可封裝為falseselect count(*)<3 from mytest where age=202 返回1 可封裝為trueselect count(*)<=1 from mytest where age=202 返回1 可封裝為trueselect name='aa' from mytest where age=10 當name為null時,sql不會報錯,返回結果也為nul,參照第二種情況的sql 3 代碼會報錯

總結:

這種情況類似于java中的判斷語句。只是java中=是賦值的意思,所以用了==來做判斷,而mysql中賦值用set,判斷就直接用=。

第二種情況,返回0或者1也能達到目的

select enable from mytest where age=202 返回1 可封裝為trueselect count(*) from mytest 返回4 可封裝為Boolean類型,但為falseselect enable from mytest where age=201 返回null 不可封裝為Boolean類型,代碼會直接報錯select id from mytest where age=202 返回’22aa’ 可封裝為Boolean類型,但為falseselect id from mytest where age=202 返回’true’ 可封裝為Boolean類型,但為trueselect id from mytest where age=202 返回’false’ 可封裝為Boolean類型,false//特殊情況select * from mytest 報錯Expected one result (or null) to be returned by selectOne(), but found: 4select * from mytest where age=202 返回一組數據false 2019-08-28 202 15 1 ,可以封裝為falseselect * from mytest where age=202 返回一組數據true 2019-08-28 202 15 1 ,可以封裝為trueselect * from mytest where age=202 返回一組數據aaaa2019-08-28 202 15 1 ,可以封裝為false

總結:

Mybatis是根據查詢到的記錄數進行轉換的(1=true,0=false)

需要注意的地方:如果查詢到多條記錄(大于1),返回的卻是false, 這時就與我們的期望的剛好相反。這里,可以換其它方法,可以通過返回記錄數,進行判斷,也可以保證記錄在數據庫是唯一的。也可以直接用第一種情況解決。

根據第4、5、6條sql語句的測試,如果字符串是'true',就可以封裝為true,如果為'false'就可以封裝為false,其他情的字符串都為false。

(猜測,并不準確,需要到mysql官網上來查,如果返回的字段是字符串,將其轉為Boolean時是按什么規則轉換的,猜測是類似于java中的字符串轉Boolean方法:Boolean.valueOf(“aaa”) //false,該方法如下)

淺談mysql返回Boolean類型的幾種情況

淺談mysql返回Boolean類型的幾種情況 至于8、9、10的sql返回一組,而接受數據的只要一個時的情況,為什么就取了id的值來封裝,有待繼續研究。

MySQL Boolean類型的坑

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 setTime: 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 setTime: 2.162s

注意觀察第一行和第二行的時間,很明顯第二行沒有用上索引,我們來看看 EXPLAIN 的結果便知道了:

> EXPLAIN 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;| 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 message.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> | 一個很大的數字 | Using where |

對此,我只想說,太坑了!

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: MySQL 數據庫
相關文章:
主站蜘蛛池模板: 成人性生交大片免费看午夜a | 亚洲图欧美日韩色综合图 | 91精品久久久久含羞草 | 狠狠操在线视频 | 国产精品宅男在线观看 | 欧美一级特黄特黄毛片 | 真人毛片 | 国产精品123区| 免费观看91视频 | 黄色网址在线免费观看 | 国产美女在线精品亚洲二区 | 国产高颜值露脸在线观看 | 无耻三级在线观看 | 久久爱www成人 | 爱婷婷网站在线观看 | 黄色录像在线免费观看 | 国产高清啪啪 | 欧美一区二区三区精品影视 | 亚洲成人av | 生活片毛片 | 尤物视频在线观看网址 | 国产精品一区二区三区四区五区 | 亚洲国产成人91精品 | 欧美日韩你懂的 | 日韩亚洲人成在线综合日本 | 亚洲人成在线免费观看 | 美女福利视频一区 | 亚洲黄色网络 | 青青草手机在线观看 | 国产日本三级在线播放线观看 | 一级做a爱过程免费视频时看 | 国产亚洲精品激情一区二区三区 | 日韩一级一欧美一级国产 | 国产精品第1页 | 深夜偷偷看视频在线观看 | 真实国产乱子伦精品一区二区三区 | 亚洲一区二区综合 | 色婷婷综合和线在线 | 2022色婷婷综合久久久 | 91官网 | 久久久久国产成人精品 |