mysql之數據表列類型和列約束一

mysql數據表在定義列時,須要肯定列的數據類型,以及列的相關屬性或是說約束,那麼mysql的列類型大體可分爲以下:
mysql

列類型可分爲以下:sql

一、數值類型ide

又分爲整數和小數學習

二、時間和日期類型測試

三、字符類型spa

稍微有C基礎的同窗應該不是很陌生,這裏呢我不會講解太多,稍微解釋一下就行。3d

整數部分blog

wKiom1ewSx3Bs78UAAAx2PXwr1s455.png

整數部分要注意的地方就是字節以及有符號和無符號的區別開發

咱們知曉1byte=8bit 那麼2的8次方就是0-255之間get

有進制轉換的同窗應該知道了,那麼有符號和無符號是指他須要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)


wKiom1ewThfChuHYAAAiAnhHovA831.png

咱們發現,在建立完後,查看得知age字段的類型後面有個括號和3,這個則是表示它的顯示寬度,也就是說咱們在建立字段時也能夠這樣建立:

age tinyint(3)  表示的是顯示寬度並不會限制存儲空間

字段名[列類型](顯示寬度)


接下來還有一個列屬性即zerofill零填充

咱們如今插入一條數據並查看

wKiom1ewT4eCFtVLAAASF2NV46c356.png

咱們並無定義它的顯示寬度,接下來咱們更新一它的字段age

alter table student modify age tinyint(2) zerofill

wKiom1ewT_LhdQJXAAASGjC6hHM699.png

而後再插入一條數據

insert into student values(null,'jack',8);

wKiom1ewUGTir0cwAAAT-oKUQic307.png

查看得知它會自動和在前面添加一個數字0這個就是zerofill的使用。

那麼咱們規定它的寬度爲2位,是否是隻能插入1-99之間的數值呢?

接下來咱們插入123這個數值是否能插入進去?

wKioL1ewUOzAq8_nAAAhGeE9tUI700.png

咱們發現是可插入成功的,說明它並無限制存儲空間。


關於其它的int,smallint,mediumint,bigint也是同樣的道理。


接下來咱們來學習一下小數

小數呢也分爲兩類,1是浮點數 2是定點數

浮點數有單精度和雙精度

wKioL1ewUgDBJOHbAAAheG_9ptE619.png


單精度和雙精度它們分別是32位和64位的,存儲空間比較大,可是存儲精度不是很高,會出現精度丟失的狀況

好比咱們建立一個單精度和雙精度的來測試一下其精度

alter table student add money float(8,2)//表示小數位數佔兩位,整數是6位


wKioL1ewU2CSVPA3AAAiL_BxIDk753.png

接下來咱們插入一條數據

insert into student values(null,'han',24,123456.12);

wKiom1ewU9vQ59CGAAAnJLrcraI351.png

咱們發現沒有什麼問題,接下來咱們再插入如下幾條數據

insert into student values(null,'lili',35,1234567.1);

wKiom1ewVF-DXxEvAAAg5hd2Z8g826.png

咱們發現當整數部分超過6位數時,數據出現了很大的變化,原來插入的1234567.1並無真正的插入成功。

那咱們再從新一下該字段

alter table student change money qian float;

wKiom1ewVSvA_M5EAAAcJav199o918.png

咱們插入如下數據

insert into student values(null,'titi',26,1234567890.1234567890);

wKiom1ewVZiTBha9AAAnDaACvLg300.png

咱們發現雖然數據好像插入成功了,但咱們檢索時看到數據顯示不對啊,這就是它的精度丟失了,因此說若是咱們要作一個與錢相關的系統時,對於浮點數無論是float,double仍是不要用,由於精度不高,經過測試咱們知道float的精度是6位,那麼dobule的精度是16位

接下來咱們測試一 下double

altet table student change qian money double;

wKioL1ewVpCyb7IDAAAlq2KAJH4639.png

接下來咱們一樣插入以下數據

insert into student values(null,'keke',28,1234567890.1234567890);

wKiom1ewV6yQ1VIWAAAvd9GLers480.png

咱們發現,整數部分10位是正確的,但小數部分是7位數了。

wKioL1ewWEayyhdMAAA2ujn9w8E049.png

咱們插入15位正數時,小數位數只有2位了,因此它的精度能夠說是16位或是17位,若是咱們插入超過15位的正數時是

wKioL1ewWLeil8D1AAArLucpFfU578.png

咱們發現它所顯示的則是使用科學計術法來顯示了即1.2345678901234568*10的16次方了因此它的有效範圍是12345678901234568 連小數都省略了。


經過上面測試咱們發現它們的存儲數據會出現精度丟失的狀況。因此咱們要開發時必定要考慮他們的精度問題。一樣浮點數也有有符號和無符號,咱們在定義的時候能夠定義合適的整數位數和小數位數

他們的定義的格式是這樣的:

float(m,d)

double(m,d)  //m是表示總長度 d是表示小數位數  

若是咱們插入的數據無論是整數或是小數超過的話就會出現精度丟失,因此它是對存儲空間是有限制的,和整數的顯示寬度是有區別的哦!

相關文章
相關標籤/搜索