關于MySQL隱式轉換以及聚集函數(shù)問題

原本是因為一個小小的問題凝垛,所以想對數(shù)據(jù)庫里的東西做個統(tǒng)計芭析,看看有沒有什么奇奇怪怪的數(shù)據(jù)凛捏,然后就是漏打了個單引號,發(fā)現(xiàn)了一個奇怪的現(xiàn)象烦磁。執(zhí)行的SQL如下:

select vc_full_name from t_fund_company_info WHERE vc_full_name=0;


結果發(fā)現(xiàn)养匈,哎,這怎么能查出數(shù)據(jù)庫里所有的數(shù)據(jù)呢都伪,而且這里邊一個符合條件的結果都沒有呕乎,是不是MySQL抽了。

所以去問了一下別人陨晶,原來是MySQL的隱式轉換猬仁。

什么叫隱式轉換?

就是說先誉,當我們對不同類型的值進行比較的時候湿刽,為了使得這些數(shù)值「可比較」(也可以稱為類型的兼容性),MySQL會做一些隱式轉化(Implicit type conversion)褐耳。

所以叭爱,上面那個語句,MySql在比較varchar類型和0的時候漱病,會把varchar類型轉換成數(shù)字0

當然MySQL也提供了這個cast()函數(shù)买雾,可以使用它來轉換成相應的類型把曼,就比如下面這個SQL:

select vc_full_name, ?cast(vc_full_name as SIGNED INTEGER) from t_fund_company_info;

結果如下:


那么,隱式轉換有什么規(guī)則呢漓穿,規(guī)則如下:

1.如果一個或兩個參數(shù)都是空的嗤军,比較的結果為null。null與null比較晃危,結果為null叙赚,無需進行轉換。

2.如果兩個比較的兩個參數(shù)都是string僚饭,按string比較孔庭,不做類型轉換。

3.如果兩個比較的兩個參數(shù)都是integer凄硼,按integer比較奇徒,不做類型轉換。

4.十六進制的值和非數(shù)字做比較時偿乖,會被當做二進制串來比較击罪。

5.有一個參數(shù)是?TIMESTAMP?或?DATETIME,并且另外一個參數(shù)是常量贪薪,常量會被轉換為?timestamp媳禁。

6.有一個參數(shù)是?decimal?類型,如果另外一個參數(shù)是?decimal?或者整數(shù)画切,會將整數(shù)轉換為?decimal?后進行比較竣稽,如果另外一個參數(shù)是浮點數(shù),則會把?decimal?轉換為浮點數(shù)進行比較

7.所有其他情況下霍弹,兩個參數(shù)都會被轉換為浮點數(shù)再進行比較丧枪。

然后網(wǎng)上大家給出了一個需要注意的問題,就是:

假如password類型為字符串庞萍,查詢條件為 int 0 則會匹配上拧烦。

然后我就去數(shù)據(jù)庫操作了一下,發(fā)現(xiàn)有驚喜钝计。


也就是說恋博,這里是可以做SQL注入的。私恬。如果網(wǎng)站登錄模塊做的比較挫的話债沮。

所以說,為了防止在進行查詢本鸣、更新或者刪除操作的時候疫衩,多操作更多的數(shù)據(jù),千萬記得寫SQL的時候加引號荣德!

PS:最后沖哥還給出了一個重要結論闷煤, MySQL 隱式類型轉換本身也是非常耗費?MySQL 服務器性能的童芹,所以非常不推薦這樣使用。

第二個事情鲤拿,是聚集函數(shù)的問題假褪。這個聚集函數(shù),平時查數(shù)據(jù)庫也會用很多近顷。

本來只想查下庫里一個文本字段生音,最大長度是多少。結果發(fā)現(xiàn)窒升,這個里面的內(nèi)容跟對應的長度不符合缀遍。按照往常的習慣,沒多想饱须,都是這樣寫的:

SELECT vc_fund_id,vc_fund_name,vc_Investment_field_txt,max(CHARACTER_LENGTH(vc_Investment_field_txt)) FROM t_fund_info;


但是TXT字段明顯沒有1305個字符域醇。

后來才意識到,沒有加group by冤寿。歹苦。

在《數(shù)據(jù)庫系統(tǒng)概念》這本書中用如下的表述:

當SQL查詢使用分組時青伤,一個很重要的事情是需要保證出現(xiàn)在select語句中但是沒有被聚集的屬性只能是出現(xiàn)在group by子句中的那些屬性督怜,換句話說,任何沒有出現(xiàn)在group by子句中的屬性如果出現(xiàn)在select子句中的話狠角,那么該屬性只能出現(xiàn)在聚集函數(shù)的內(nèi)部号杠,否則,這樣的查詢就是錯誤的丰歌。

所以說姨蟋,比如有這樣一個表info,有如下字段:

id ?name ?num price

那么你這樣查:

select * from info group by id;

select id,sum(price) from info where price >= 10;

select id,count(price) from info where price >= 10;

select id, count(*) as num_prods, price from ?info where price >= 10;

這些都是錯的立帖!

第一個語句當中眼溶,這個查詢按照id分組,然而select子句中的代表info中的所有屬性晓勇,更進一步的堂飞,除了id之外,該表的其他屬性都未出現(xiàn)在group by子句中绑咱。所以是錯的绰筛。

余下兩個也是一樣的。

最關鍵是描融,即使你這樣寫铝噩,MySQL也不會報錯。窿克。骏庸。但是結果卻讓你很困惑毛甲。。

大概所有數(shù)據(jù)庫都存在這種問題吧敞恋,像oracle丽啡、SQLserver等。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末硬猫,一起剝皮案震驚了整個濱河市补箍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌啸蜜,老刑警劉巖坑雅,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異衬横,居然都是意外死亡裹粤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門蜂林,熙熙樓的掌柜王于貴愁眉苦臉地迎上來遥诉,“玉大人,你說我怎么就攤上這事噪叙“猓” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵睁蕾,是天一觀的道長苞笨。 經(jīng)常有香客問我,道長子眶,這世上最難降的妖魔是什么瀑凝? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮臭杰,結果婚禮上粤咪,老公的妹妹穿的比我還像新娘。我一直安慰自己渴杆,他們只是感情好寥枝,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著将塑,像睡著了一般脉顿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上点寥,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天艾疟,我揣著相機與錄音,去河邊找鬼。 笑死蔽莱,一個胖子當著我的面吹牛弟疆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播盗冷,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼怠苔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了仪糖?” 一聲冷哼從身側響起柑司,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锅劝,沒想到半個月后攒驰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡故爵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年玻粪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诬垂。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡劲室,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出结窘,到底是詐尸還是另有隱情很洋,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布晦鞋,位于F島的核電站蹲缠,受9級特大地震影響棺克,放射性物質發(fā)生泄漏悠垛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一娜谊、第九天 我趴在偏房一處隱蔽的房頂上張望确买。 院中可真熱鬧,春花似錦纱皆、人聲如沸湾趾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搀缠。三九已至,卻和暖如春近迁,著一層夾襖步出監(jiān)牢的瞬間艺普,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留歧譬,地道東北人岸浑。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像瑰步,于是被迫代替她去往敵國和親矢洲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 什么是數(shù)據(jù)庫缩焦? 數(shù)據(jù)庫是存儲數(shù)據(jù)的集合的單獨的應用程序读虏。每個數(shù)據(jù)庫具有一個或多個不同的API,用于創(chuàng)建袁滥,訪問掘譬,管理...
    chen_000閱讀 4,039評論 0 19
  • 一、SQL速成 結構查詢語言(SQL)是用于查詢關系數(shù)據(jù)庫的標準語言呻拌,它包括若干關鍵字和一致的語法葱轩,便于數(shù)據(jù)庫元件...
    shadow雨軒閱讀 514評論 0 3
  • 第四天 今天,你和我說你爸交給你的任務藐握,叫你去買月餅送給主任靴拱,突然意識到,現(xiàn)實就是這么殘酷猾普,送禮無處不在袜炕。一個工作...
    筆尖的舞鞋閱讀 152評論 0 1
  • “看聶隱娘看到睡著的都是不懂藝術偎窘,只知道爆米花的庸俗觀眾”?溜在?陌知? 我就是那個看聶隱娘看睡著的low咖。但也別說我就...
    某琳閱讀 1,188評論 4 10
  • 儒雅風范 幽默風趣 生動活潑 上的是感染與防御 鉤端螺旋體這一塊 你看她細長柔軟的身軀 婀娜性感的腰肢 活潑可愛...
    李帥蛋閱讀 112評論 0 0