mysql下有符號數和無符號數的相關問題

來源:互聯網
上載者:User

標籤:參數   進位   數字   轉換   相關   之間   方便   儲存   原來   

最近自己的程式在調用mysql的預存程序傳參給smallint類型變數的時候,總是出現out of range value的錯誤,剛開始用C數值轉換方式的二進位位轉換思路來思考時,總是覺得沒什麼問題,因為我的數確實在16位位元下能儲存,但是後來才發現,原來mysql並不是按照這種二進位轉換的方式。

 

先附上mysql各個整數類型的取值範圍:

bigint
從 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型資料(所有數字)。儲存大小為 8 個位元組。
P.S. bigint已經有長度了,在mysql建表中的length,只是用於顯示的位元
int
從 -2^31 (-2,147,483,648) 到 2^31 – 1 (2,147,483,647) 的整型資料(所有數字)。儲存大小為 4 個位元組。int 的 SQL-92 同義字為 integer。
smallint
從 -2^15 (-32,768) 到 2^15 – 1 (32,767) 的整型資料。儲存大小為 2 個位元組。
tinyint
從 0 到 255 的整型資料。儲存大小為 1 位元組。 

 

因為所要調用的預存程序主要是為了實現insert操作,而和這個預存程序中smallint類型的變數對應的表中欄位是一個無符號smallint,由於mysql預存程序是沒有無符號這種類型,所以只好在預存程序接受時用smallint接收,當時猜想mysql可能和C語言中一樣應該會自動對有符號數進行無符號數轉換。

可是並不是這樣,當我傳入參數64000(在無符號bigint內不在有符號bigint內),mysql會提示錯誤out of range value,意思是超出了取值範圍。在不斷的測試之後,我發現mysql並不會像常用的程式設計語言的機制那樣,會自動將有符號數轉換為無符號數,當判斷你不在有符號數(此處是-32768-32767)或者無符號數(0-65535)之間時,它就認定你是一個非法數,超出了範圍,然後會提示錯誤;當你用無符號數時,你傳入的若是一個負數,則認定你傳入的數也是一個非法數(親測是這樣),然後也會提示該錯誤。

解決方案:

由於預存程序沒有無符號類型,所以在接受傳入的值的時候,我們可以使用大範圍的數進行接收,比如這裡我將smallint類型改為了int,就能正常運行了。

 

個人理解:

我個人覺得,mysql裡面在數值方面並沒有特別注意類型這個概念,而只是關心的是範圍,我們設定了類型,其實就是設定了範圍,當我們傳入一個數字,如果在這個範圍內,我們就認定是這個類型的。當然這是我個人的看法,只是為了方便理解。如果有什麼問題的話,希望大家多提建議。

 

mysql下有符號數和無符號數的相關問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.