標籤:mysql之資料表列類型和列約束
mysql資料表在定義列時,需要確定列的資料類型,以及列的相關屬性或是說約束,那麼mysql的列類型大致可分為如下:
列類型可分為如下:
1、數實值型別
又分為整數和小數
2、時間和日期類型
3、字元類型
稍微有C基礎的同學應該不是很陌生,這裡呢我不會講解太多,稍微解釋一下就行。
整數部分
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M02/85/F1/wKiom1ewSx3Bs78UAAAx2PXwr1s455.png" title="1.png" alt="wKiom1ewSx3Bs78UAAAx2PXwr1s455.png" />
整數部分要注意的地方就是位元組以及有符號和無符號的區別
我們知曉1byte=8bit 那麼2的8次方就是0-255之間
有進位轉換的同學應該知道了,那麼有符號和無符號是指他需要1位來標識正負數,所以要減去1位,自然就是7位了,2的7次方就是127了,我們使用unsigned來標識為無符號。
位元組數越大就是說位元越多8位,12位,24位,32位,64位,進行轉換成10進位就得到最小值和最大值的資料了。
0000 0000 ---1111 1111 轉換為10進位就是0-255 轉換為16進位就是0-00ff
那麼我們在建立欄位時,就要考慮該值的大致範圍,如我們要儲存一個人的年齡則應該是tinyint則比較合適,從而不浪費空間,那麼年齡是沒有負數的所以是unsigned.
如我們建立一個學生表
create table student(
id int,
name varchar(5),
age tinyint unsigned)
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M02/85/F2/wKiom1ewThfChuHYAAAiAnhHovA831.png" title="2.png" alt="wKiom1ewThfChuHYAAAiAnhHovA831.png" />
我們發現,在建立完後,查看得知age欄位的類型後面有個括弧和3,這個則是表示它的顯示寬度,也就是說我們在建立欄位時也可以這樣建立:
age tinyint(3) 表示的是顯示寬度並不會限制儲存空間
欄位名[列類型](顯示寬度)
接下來還有一個列屬性即zerofill零填充
我們現在插入一條資料並查看
650) this.width=650;" src="http://s4.51cto.com/wyfs02/M00/85/F2/wKiom1ewT4eCFtVLAAASF2NV46c356.png" title="3.png" alt="wKiom1ewT4eCFtVLAAASF2NV46c356.png" />
我們並沒有定義它的顯示寬度,接下來我們更新一它的欄位age
alter table student modify age tinyint(2) zerofill
650) this.width=650;" src="http://s5.51cto.com/wyfs02/M02/85/F2/wKiom1ewT_LhdQJXAAASGjC6hHM699.png" title="3.png" alt="wKiom1ewT_LhdQJXAAASGjC6hHM699.png" />
然後再插入一條資料
insert into student values(null,‘jack‘,8);
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M00/85/F2/wKiom1ewUGTir0cwAAAT-oKUQic307.png" title="3.png" alt="wKiom1ewUGTir0cwAAAT-oKUQic307.png" />
查看得知它會自動和在前面添加一個數字0這個就是zerofill的使用。
那麼我們規定它的寬度為2位,是不是只能插入1-99之間的數值呢?
接下來我們插入123這個數值是否能插入進去?
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M02/85/F1/wKioL1ewUOzAq8_nAAAhGeE9tUI700.png" title="3.png" alt="wKioL1ewUOzAq8_nAAAhGeE9tUI700.png" />
我們發現是可插入成功的,說明它並沒有限制儲存空間。
關於其它的int,smallint,mediumint,bigint也是一樣的道理。
接下來我們來學習一下小數
小數呢也分為兩類,1是浮點數 2是定點數
浮點數有單精確度和雙精確度
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/85/F1/wKioL1ewUgDBJOHbAAAheG_9ptE619.png" title="3.png" alt="wKioL1ewUgDBJOHbAAAheG_9ptE619.png" />
單精確度和雙精確度它們分別是32位和64位的,儲存空間比較大,但是儲存精度不是很高,會出現精度丟失的情況
比如我們建立一個單精確度和雙精確度的來測試一下其精度
alter table student add money float(8,2)//表示小數位元佔兩位,整數是6位
650) this.width=650;" src="http://s5.51cto.com/wyfs02/M01/85/F1/wKioL1ewU2CSVPA3AAAiL_BxIDk753.png" title="3.png" alt="wKioL1ewU2CSVPA3AAAiL_BxIDk753.png" />
接下來我們插入一條資料
insert into student values(null,‘han‘,24,123456.12);
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M00/85/F2/wKiom1ewU9vQ59CGAAAnJLrcraI351.png" title="3.png" alt="wKiom1ewU9vQ59CGAAAnJLrcraI351.png" />
我們發現沒有什麼問題,接下來我們再插入以下幾條資料
insert into student values(null,‘lili‘,35,1234567.1);
650) this.width=650;" src="http://s1.51cto.com/wyfs02/M01/85/F2/wKiom1ewVF-DXxEvAAAg5hd2Z8g826.png" title="3.png" alt="wKiom1ewVF-DXxEvAAAg5hd2Z8g826.png" />
我們發現當整數部分超過6位元時,資料出現了很大的變化,原來插入的1234567.1並沒有真正的插入成功。
那我們再重新一下該欄位
alter table student change money qian float;
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/85/F2/wKiom1ewVSvA_M5EAAAcJav199o918.png" title="3.png" alt="wKiom1ewVSvA_M5EAAAcJav199o918.png" />
我們插入以下資料
insert into student values(null,‘titi‘,26,1234567890.1234567890);
650) this.width=650;" src="http://s1.51cto.com/wyfs02/M02/85/F2/wKiom1ewVZiTBha9AAAnDaACvLg300.png" title="3.png" alt="wKiom1ewVZiTBha9AAAnDaACvLg300.png" />
我們發現雖然資料好像插入成功了,但我們檢索時看到資料顯示不對啊,這就是它的精度丟失了,所以說如果我們要做一個與錢相關的系統時,對於浮點數不管是float,double還是不要用,因為精度不高,通過測試我們知道float的精度是6位,那麼dobule的精度是16位
接下來我們測試一 下double
altet table student change qian money double;
650) this.width=650;" src="http://s1.51cto.com/wyfs02/M01/85/F2/wKioL1ewVpCyb7IDAAAlq2KAJH4639.png" title="3.png" alt="wKioL1ewVpCyb7IDAAAlq2KAJH4639.png" />
接下來我們同樣插入如下資料
insert into student values(null,‘keke‘,28,1234567890.1234567890);
650) this.width=650;" src="http://s1.51cto.com/wyfs02/M00/85/F2/wKiom1ewV6yQ1VIWAAAvd9GLers480.png" title="3.png" alt="wKiom1ewV6yQ1VIWAAAvd9GLers480.png" />
我們發現,整數部分10位是正確的,但小數部分是7位元了。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/85/F2/wKioL1ewWEayyhdMAAA2ujn9w8E049.png" title="3.png" alt="wKioL1ewWEayyhdMAAA2ujn9w8E049.png" />
我們插入15位正數時,小數位元只有2位了,所以它的精度可以說是16位或是17位,如果我們插入超過15位的正數時是
650) this.width=650;" src="http://s5.51cto.com/wyfs02/M01/85/F2/wKioL1ewWLeil8D1AAArLucpFfU578.png" title="3.png" alt="wKioL1ewWLeil8D1AAArLucpFfU578.png" />
我們發現它所顯示的則是使用科學計術法來顯示了即1.2345678901234568*10的16次方了所以它的有效範圍是12345678901234568 連小數都省略了。
通過上面測試我們發現它們的儲存資料會出現精度丟失的情況。所以我們要開發時一定要考慮他們的精度問題。同樣浮點數也有有符號和無符號,我們在定義的時候可以定義合適的整數位元和小數位元
他們的定義的格式是這樣的:
float(m,d)
double(m,d) //m是表示總長度 d是表示小數位元
如果我們插入的資料不管是整數或是小數超過的話就會出現精度丟失,所以它是對儲存空間是有限制的,和整數的顯示寬度是有區別的哦!
本文出自 “樂學” 部落格,請務必保留此出處http://lestudy.blog.51cto.com/6378140/1837851
mysql之資料表列類型和列約束一