原先對mysql不太理解,但也沒有報錯。但理解的不夠深刻。此次補上。php
原來覺得int(11)是指11個字節,int(10)就是10個字節。我錯了。html
http://zhidao.baidu.com/link?url=puYWaGBQNKNHgffO5kdvXshF3KmX8OuB4Mor3HXapbNHa8m1CdlF8PJTqVuKa1eKcEd6Bv2NKUr3I-KJr5-7ISLhBsmf17Lu69vxv2aR99_mysql
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) 極大整數值linux
這些類型,是定長的,其容量是不會隨着後面的數字而變化的,好比int(11)和int(8),都是同樣的佔4字節。tinyint(1)和tinyint(10)也都佔用一個字節。sql
那麼後面的11和8,有啥用呢。數據庫
http://zhidao.baidu.com/link?url=b0Z-WIhggaErl3uhMrAhoEXQG_3zotyd7r31O3RXSYiFJo1Cad-NeWN8cFXZFI50yVG_lpKooT7OjLhIa20ephKFJYD-fV9ZAv_o63AfyVqoracle
mysql數據庫中以 :數據類型(m) 來約束數據,其中 數字m在不一樣的數據類型中表示含義是不一樣的。 我們這裏只講整數。url
整型數系統已經限制了取值範圍,tinyint佔1個字節、int佔4個字節。因此整型數後面的m不是表示的數據長度,而是表示數據在顯示時顯示的最小長度。.net
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)的同義詞。