1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
      MySQL中出現(xiàn)floor()報(bào)錯(cuò)的原因是什么
      這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān) 中出現(xiàn)floor()報(bào)錯(cuò)的原因是什么,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

      這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān) 中出現(xiàn)floor()報(bào)錯(cuò)的原因是什么,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

      select count(*) from users group by concat(database(),floor(rand(0)*2));select count(*),concat(database(),floor(rand(0)*2))x from users group by x;

      目前成都創(chuàng)新互聯(lián)已為1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計(jì)、楊浦網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

      它們表達(dá)的意思是一樣的,第二條語(yǔ)句中的as x其實(shí)就是concat(database(),floor(rand(0)*2))的代指(別名),這兩個(gè)SQL語(yǔ)句表達(dá)的意思并沒什么區(qū)別。來(lái),讓我們瞅瞅它報(bào)了什么錯(cuò):ERROR 1062 (23000): Duplicate entry 'security1' for key 'group_key'

      它說(shuō)'group_key'的主鍵'security1'重復(fù)了,嗯?‘security1’從哪里來(lái)的?哪個(gè)表的主鍵重復(fù)了?

      雖然剛開始,咱們還不知道原理,但是可以看到報(bào)錯(cuò)提示語(yǔ)句中的數(shù)據(jù)庫(kù)函數(shù)已經(jīng)被執(zhí)行了。就像我之前說(shuō)的那樣,我本身有用到sqli-labs的數(shù)據(jù)庫(kù),所以database()執(zhí)行后是’security’很正常吧。

      floor(rand(0)*2)

      security1中的1便是來(lái)自floor(rand(0)*2),它說(shuō)security1重復(fù),那說(shuō)明之前的表中已經(jīng)有這個(gè)主鍵了。因?yàn)閐atabase()固定,我們繼續(xù)來(lái)看下產(chǎn)生1的這個(gè)floor(rand(0)*2)。rand()同樣是一個(gè)數(shù)學(xué)函數(shù),它返回一個(gè)隨機(jī)浮點(diǎn)值[0,1]。

      若指定一個(gè)整數(shù)參數(shù)N,則它被作用種子值(也被叫為隨機(jī)因子),(rand()會(huì)根據(jù)這個(gè)種子值隨機(jī)生成)用來(lái)產(chǎn)生重復(fù)序列,也就是rand(0)的值重復(fù)計(jì)算是固定的。

      而它后面的*2,則是選定獲取數(shù)據(jù)的范圍[0,2],其實(shí)就是乘以2。

      floor()同樣是一個(gè)數(shù)學(xué)函數(shù),返回不大于x的最大整數(shù)值,比如floor(3.3)返回3,floor(-3.3)返回-4。 

      現(xiàn)在讓我們看下計(jì)算users表數(shù)據(jù)的次數(shù),floor(rand(0)*2)的值。

      可以看到rand(0)的值確實(shí)是固定的。同時(shí)1也出現(xiàn)了。 concat()是字符串拼接函數(shù),拼接多個(gè)字符串,如果字符串中含有NULL,則返回結(jié)果為NULL。這樣來(lái)看,concat后的結(jié)果為’security0’或’security1’,’security1’出現(xiàn)了。

      分析到這,我們后半部分沒什么好說(shuō)的了,rand()還有一個(gè)非常重要的特性我們之后跟group by一起說(shuō)。

      group by 與 count(*)

      咱們?cè)賮?lái)說(shuō)這個(gè)count(*),這是一個(gè)聚合函數(shù),返回值的數(shù)目,它與count()的區(qū)別是它不排除NULL。

      咱們通過(guò)select count(*) from users group by username;這個(gè)查詢語(yǔ)句來(lái)了解下group by的工作過(guò)程。

      group by在執(zhí)行時(shí),會(huì)依次取出查詢表中的記錄并創(chuàng)建一個(gè)臨時(shí)表,group by的對(duì)象便是該臨時(shí)表的主鍵。如果臨時(shí)表中已經(jīng)存在該主鍵,則將count(*)值加1,如果不存在,則將該主鍵插入到臨時(shí)表中,注意是插入!查詢前創(chuàng)建的空臨時(shí)表。

      取第一條記錄,username是Dumb,發(fā)現(xiàn)臨時(shí)表中沒有該主鍵,則將Dumb插入到主鍵,count(*)值計(jì)1,取第二條記錄。

      同樣,取第二條記錄,username為Angelina,同樣沒有該主鍵,則將Angelina插入到主鍵,count(*)值計(jì)1。

      當(dāng)取到原表中第8條admin時(shí),同樣將admin作為主鍵插入到臨時(shí)表中,并將count(*)計(jì)1.當(dāng)取第15條數(shù)據(jù)時(shí),發(fā)現(xiàn)臨時(shí)表中已經(jīng)有admin作為主鍵了,則直接count(*)加1。最終結(jié)果:

      雖然在命令行中的顯示結(jié)果跟咱的不太一樣,但是思路是正確的(它貌似對(duì)結(jié)果按照字母進(jìn)行了排序,又或者在插入臨時(shí)表前就先進(jìn)行了排序)。

      寫到這里,那按照上面的邏輯,報(bào)錯(cuò)語(yǔ)句應(yīng)該是select count(*) from users group by ‘security0’或’security1’;啊?然后group by時(shí)創(chuàng)建臨時(shí)表,第一個(gè)是security0,發(fā)現(xiàn)沒有這個(gè)主鍵,此時(shí)將security0插入主鍵的位置,計(jì)1,然后取from的表中下一條記錄。

      取下一條記錄,group by 后是‘security1‘,臨時(shí)表中不存在security1的主鍵,則將security1插入主鍵位置,計(jì)1,然后取下一條記錄。

      之后group by 只有security0或security1,那應(yīng)該只是計(jì)數(shù)上的變化了啊。最終應(yīng)該是:

      那為什么不是這個(gè)結(jié)果,反而報(bào)了主鍵重復(fù)的錯(cuò)誤了呢?

      因?yàn)檫€有一個(gè)最重要的特性,就是group by與rand()使用時(shí),如果臨時(shí)表中沒有該主鍵,則在插入前rand()會(huì)再計(jì)算一次(也就是兩次,但有些博客寫的是多次,這個(gè)多次到底是幾次我并不知道,也沒有找到相關(guān)材料作為支持,但是以兩次來(lái)理解下面的實(shí)驗(yàn)都能說(shuō)的通),就是這個(gè)特性導(dǎo)致了主鍵重復(fù)并報(bào)錯(cuò)。我們來(lái)看:

      當(dāng)group by 取第一條from 的表記錄時(shí),此時(shí)group by的是’security0’,發(fā)現(xiàn)臨時(shí)表中并沒有’security0‘的主鍵,注意,這個(gè)時(shí)候rand(0)*2會(huì)再計(jì)算一次,經(jīng)floor()后,率先插入臨時(shí)表的主鍵不是security0,而是security1,并計(jì)數(shù)1。

      然后取第二條記錄,第二條記錄group by 的key中的01仍由floor(rand(0)*2)繼續(xù)計(jì)算獲得,也就是security1。此時(shí)臨時(shí)表中已經(jīng)有security1的主鍵了,所以count(*)直接加1就可以。

      繼續(xù)從from的表中取第三條記錄,再次計(jì)算floor(rand(0)*2),結(jié)果為0,與database()拼接為security0,臨時(shí)表的主鍵中并不存在,在插入前,floor(rand(0)*2)又計(jì)算一次,拼接后與secruity1,但是是直接插入,即使臨時(shí)表中已經(jīng)有了主鍵security1也硬要插入,從而導(dǎo)致主鍵重復(fù)報(bào)錯(cuò),也就是:ERROR 1062 (23000): Duplicate entry 'security1' for key 'group_key'。 

      寫到這里報(bào)錯(cuò)的原理已經(jīng)說(shuō)完了,各位觀眾老爺感覺呼應(yīng)上了嗎?

      優(yōu)化

      咱們繼續(xù)看,咱們共從from的表中取了三條記錄(這也是floor(rand(0)*2)最少需要表中有三條記錄的原因),因?yàn)閒loor(rand(0)*2)的值為011011...,但其實(shí)第三次計(jì)算的1可以不要的(變?yōu)?101)。

      如果某個(gè)floor(rand(x)*2)滿足0101或1010,那么from 的表中兩條數(shù)據(jù)就是可以報(bào)錯(cuò)的。我經(jīng)過(guò)多次實(shí)驗(yàn),發(fā)現(xiàn)floor(rand(14)*2)的值為101000...,那么咱們創(chuàng)建一個(gè)有兩條數(shù)據(jù)的表試一下康康。

      創(chuàng)建一個(gè)test表,里面只有兩條數(shù)據(jù)。

      分別用rand(0)*2和rand(14)*2做實(shí)驗(yàn)。


      本文題目:MySQL中出現(xiàn)floor()報(bào)錯(cuò)的原因是什么
      文章鏈接:http://ef60e0e.cn/article/chgs.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        丰原市| 榆树市| 岢岚县| 博爱县| 遵化市| 德惠市| 平江县| 嘉兴市| 樟树市| 敖汉旗| 马龙县| 平武县| 东乌| 辽宁省| 安徽省| 莲花县| 盖州市| 安塞县| 泾川县| 左权县| 荆州市| 峡江县| 南丰县| 托克逊县| 广州市| 岳普湖县| 西城区| 固镇县| 青神县| 吉水县| 津市市| 阿克苏市| 淮安市| 北碚区| 酒泉市| 黑水县| 青州市| 青河县| 灯塔市| 涿鹿县| 红河县|