1. 程式人生 > >關於mysql欄位型別的說明

關於mysql欄位型別的說明

mysql中整數型別後面的數字,是不是指定這個欄位的長度?比如int(11),11代表11個位元組嗎?

原先對mysql不太理解,但也沒有報錯。但理解的不夠深入。這次補上。

原來以為int(11)是指11個位元組,int(10)就是10個位元組。我錯了。

 

http://zhidao.baidu.com/link?url=puYWaGBQNKNHgffO5kdvXshF3KmX8OuB4Mor3HXapbNHa8m1CdlF8PJTqVuKa1eKcEd6Bv2NKUr3I-KJr5-7ISLhBsmf17Lu69vxv2aR99_

mysql的基本資料型別裡幾個int如下:
型別 大小 範圍(有符號) 範圍(無符號) 用途 
TINYINT 1位元組 (-128,127) (0,255) 小整數值 
SMALLINT 2 位元組 ( -2^15 :-32 768,2^15 - 1:32 767) (0,65 535) 大整數值 
MEDIUMINT 3 位元組 (-8 388 608,8 388 607) (0,16 777 215) 大整數值 
INT或INTEGER(int 的 SQL-92 同義字為 integer) 4 位元組 (-2^31:-2 147 483 648, 2^31 - 1:2 147 483 647) (0,4 294 967 295) 大整數值 
BIGINT 8 位元組 (-2^63:-9 233 372 036 854 775 808,2^63-1:9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 極大整數值

這些型別,是定長的,其容量是不會隨著後面的數字而變化的,比如int(11)和int(8),都是一樣的佔4位元組。tinyint(1)和tinyint(10)也都佔用一個位元組。

那麼後面的11和8,有啥用呢。

 

http://zhidao.baidu.com/link?url=b0Z-WIhggaErl3uhMrAhoEXQG_3zotyd7r31O3RXSYiFJo1Cad-NeWN8cFXZFI50yVG_lpKooT7OjLhIa20ephKFJYD-fV9ZAv_o63AfyVq

mysql資料庫中以 :資料型別(m)  來約束資料,其中 數字m在不同的資料型別中表示含義是不同的。 咱們這裡只講整數。

整型數系統已經限制了取值範圍,tinyint佔1個位元組、int佔4個位元組。所以整型數後面的m不是表示的資料長度,而是表示資料在顯示時顯示的最小長度。

tinyint(1) 這裡的1表示的是 最短顯示一個字元。tinyint(2) 這裡的2表示的是 最短顯示兩個字元。

當字元長度超過(m)時,相當於啥都沒發生;

當字元長度小於(m)時,就需要指定拿某個字元來填充,比如zerofill(表示用0填充),

設定tinyint(2) zerofill 你插入1時他會顯示01;設定tinyint(4) zerofill 你插入1時他會顯示0001。

所以,沒有zerofill,(m)就是無用的。

 

http://blog.csdn.net/phpwish/article/details/7845921

綜上整型的資料型別括號內的數字不管是多少,所佔的儲存空間都固定的。

 

http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/08/25/2153016.html

mysql 中int(1)和tinyint(1)中的1只是指定顯示長度,並不表示儲存長度,只有欄位指定zerofill時有用。

位數限制基本沒有意義。

 

在mysql中我做過實驗,對於一個tinyint型別的欄位,不管它是tinyint(1)還是tinyint(2)還是tinyint(3),

當你插入大於127的數,都會存入127。跟上文中的結論是一樣的。

 

 

 

總結:int(11),tinyint(1),bigint(20),後面的數字,不代表佔用空間容量。而代表最小顯示位數。這個東西基本沒有意義,除非你對欄位指定zerofill。

所以我們在設計mysql資料庫時,

建表時,mysql會自動分配長度:int(11)、tinyint(4)、smallint(6)、mediumint(9)、bigint(20)。

所以,就用這些預設的顯示長度就可以了。不用再去自己填長度,比如搞個int(10)、tinyint(1)之類的,基本沒用。而且導致表的欄位型別多樣化。


http://blog.csdn.net/longyulu/article/details/7326581

該文很好地總結了mysql所有的資料型別。

我在建一個float型別的欄位時,故意建成float(2,3)型,是錯誤的。報錯如下。

第一個數字M,代表總長度限制(總長度包括小數位和整數位),2代表總長度不能超過2個字元,比如2.34,就超過了2位總長度;

第二個數字D,代表小數位的長度限制。0.2表示佔用了1個小數位。

這樣看,當然M必需大於等於D。

比如設定為float(2,2),那麼寫入12.3這個數字時,實際插入的是0.99。

比如設定為float(2,1),那麼寫入12.3這個數字時,實際插入的是9.9。

mysql會自動擷取該欄位能接受的最大值存入。

那麼設定為float(0,0),則相當於不受限制,或者說受float本身的精度限制。

 對於mysql的浮點型,實在太複雜,沒搞清,看這篇:http://www.jb51.net/article/31723.htm


 

 

再來看看mysql的整型、浮點型,怎麼跟oracle的資料型別NUMBER對應的。

先來看看oracle的NUMBER型別的特點:

參考http://www.linuxidc.com/Linux/2012-02/54603.htm

Number(p, s) 宣告一個定點數 p(precision)為精度,s(scale)表示小數點右邊的數字個數,精度最大值為38,scale的取值範圍為-84到127

Number(p) 宣告一個整數 相當於Number(p, 0)

Number 宣告一個浮點數 其精度為38,要注意的是scale的值沒有應用,也就是說scale的值不能簡單的理解為0,或者其他的數。

定點數的精度(p)和刻度(s)遵循以下規則:

 當一個數的整數部分的長度 > p-s 時,Oracle就會報錯。(可見s個位置是留給小數的;p-s個位置是留給整數部分的,這樣很清晰啊。p代表整數位和小數位全部的長度限制,這一點跟mysql很像)

 當一個數的小數部分的長度 > s 時,Oracle就會舍入。(同上,實際上不會報錯,oracle會四捨五入,比如NUMBER(4,2),插入99.248,儲存為99.25;插入99.242,儲存為99.24;插入99.2448,儲存為99.24而不是99.25,注意他四捨五入的位置是s位。)

 當s(scale)為負數時,Oracle就對小數點左邊的s個數字進行舍入。(暫時不管它)

 當s > p 時, p表示小數點後第s位向左最多可以有多少位數字,如果大於p則Oracle報錯,小數點後s位向右的數字被舍入。(暫時不管它)

 

經實驗,比如定義一個欄位為Number(3),那麼寫入該欄位,最多不能超過3個數字。比如,你可以插入999(或-999),但是不能插入1000(或-1000)。以此類推。

比如定義一個欄位為Number(3,2),那麼寫入該欄位,最多不能超過3位的整數,最多2位的小數。

 

綜上,我們可以看出mysql和oracle的對應關係:

 

mysql oracle 理由

tinyint(1位元組)

以及tinyint unsigned

NUMBER(3)

範圍(-128,127) (0,255),所以至少NUMBER(3)對應。

但是不能NUBER(1),這樣只能最大存9。

smallint(2位元組)

以及smallint unsigned

NUMBER(5) 範圍(-32 768,32 767) (0,65 535) ,所以至少NUMBER(5)對應。

MEDIUMINT(3位元組)

以及

MEDIUMINT unsigned

NUMBER(7)

以及

NUMBER(8)

範圍(-8 388 608,8 388 607) (0,16 777 215),所以

非unsigned用NUMBER(7)對應;

unsigned用NUMBER(8)對應。

int(4位元組)

以及

int unsigned

NUMBER(10)

範圍(-2 147 483 648, 2 147 483 647) (0,4 294 967 295),

所以至少NUMBER(10)對應。

bigint(5位元組)

以及bigint unsigned

NUMBER(19)

以及

NUMBER(20)

 範圍(-9 233 372 036 854 775 808,9 223 372 036 854 775 807)

(0,18 446 744 073 709 551 615),

所以非unsigned用NUMBER(19)對應;

unsigned用NUMBER(20)對應。

float(m,d)

以及

unsigned

NUMBER(m,d)

 因為NUMBER(m,d)是定點數,精度超過浮點數。

所以只需保持位數一致即可,精度也會更強。

double(m,d)

以及

unsigned

NUMBER(m,d) 同上。

decimal(m,d)

以及

unsigned

NUMBER(m,d)

Decimal(n,m)表示數值中共有n位數,其中整數n-m位,小數m位。

例:decimal(10,6),數值中共有10位數,其中整數佔4位,小數佔6位。

p (有效位數)必需是1~38之間的數。

 

ORACLE中有SMALLINT,INT,INTEGER型別,不過這是NUMBER(38,0)的同義詞。

轉自:

https://www.cnblogs.com/stringzero/p/5707467.html