上一章節內容主要介紹了一些MySQL中對表和庫的增刪改查操作,對于上一章中對與表中字段的一些定義進行說明,本章主要介紹關于數據庫類型的一些定義。

一、概述:

MySQL數據庫中的數據大致可以分為以下幾類,從而實現數據庫在操作的時候對不同類型的處理。對數據庫分類的優點主要有以下幾種:

1、使系統能夠根據數據類型來操作數據

2、預防數據運算的時候出錯

通過分類,可以將每個類型不特定的行為聯系在一起執行這些行為時,數據分類將有效避免不同類型數據之間的錯誤,做場見的是字符串數字相加。

3、更見有效的利用空間。

4、定義數據類型實際是定義表中的列

二、數據庫類型的分類

數據庫的分類可以分為數值類型,字符型,日期型、文本型TEXT及復合型。

2.1 數值型

2.1.1 整型

tinyint(-127~128之間的整數)

smallint(短整型:(-32768~32767)數值占用2字節, 用帶符號的二進制整數形式存儲)

mediumint

auto_increment(自增長類型)

row num

int (整型默認為11個字節)

bigint(大整型)

Population

舉例:

創建表包含以上類型,且每個字段中均輸入99999999數值,并查看

mysql>?insert?into?mydata?values(99999999,999999999,99999999,999999999,999999999);
ERROR?1264?(22003):?Out?of?range?value?for?column?'id1'?at?row?1
提示id1,報錯
mysql>?select?*?from?mydata;
+------+--------+--------+-----------+-----------+
|?id1??|?id2????|?id3????|?id4???????|?id5???????|
+------+--------+--------+-----------+-----------+
|??127?|?-32768?|??65535?|?999999999?|?999999999?|
|??127?|?-32768?|?655356?|?999999999?|?999999999?|
+------+--------+--------+-----------+-----------+

在MySQL5.5及以上版本之后各個字段類型數字超出長度限制則均不能創建成功;

mysql>?insert?into?mydata(id1)?values('NIHAO');
ERROR?1366?(HY000):?Incorrect?integer?value:?'NIHAO'?for?column?'id1'?at?row?1

類型不同的數據也限制執行插入操作

類型直接均可使用int(n)這里的n則是對整型數據的長度進行限制,n的最大值為255

2.2 整型修飾符:

unsigned 無符號整數,修飾符:規定字段只能保存正的數據。其可以增大這個字段正整數的支持范圍。

zerofill 規定0填充(默認是空格)填補輸出的值,使用這個值可以防止MySQL存儲負值。

例如:超時會員卡編號

No?0000000000000001
mysql>?create?table?mydata2(id?int(10)?unsigned?zerofill);
Query?OK,?0?rows?affected?(0.14?sec)
mysql>?insert?into?mydata2?values(1);
Query?OK,?1?row?affected?(0.01?sec)
mysql>?select?*?from?mydata2;
+------------+
|?id?????????|
+------------+
|?0000000001?|
+------------+
1?row?in?set?(0.00?sec)
mysql>


2.2 浮點型數值

float(單精度),double(雙精度),decimal(精度確定)

float和dobule是浮點數,數值越大與不精確

Decimal是定點數,常用來存儲財務工資方面,具備高精度

float(5,2):表示字段有限長度是5位,其中整數部分為3位,小數部分為2位,小數點超出部分則執行四舍五入,其占用4個字節

double:8個字節村粗

decimal:用來存儲精度的小數,消耗空間,運算較慢。可以使用bigint替代。

8762435.543?mm=x*1000?=?8762435543
select?mm/1000?from?tb_name;
mysql>?create?table?mydata3(tb?float(4,1),td?double(5,2),tc?decimal(5,2));
Query?OK,?0?rows?affected?(0.09?sec)
mysql>?insert?into?mydata3?values(45.6789,45.6789,45.6789);
Query?OK,?1?row?affected,?1?warning?(0.08?sec)
mysql>?select?*?from?mydata3;
+------+-------+-------+
|?tb???|?td????|?tc????|
+------+-------+-------+
|?45.7?|?45.68?|?45.68?|
+------+-------+-------+
1?row?in?set?(0.00?sec)
mysql>

三、字符串類型

3.1字符串類型比較

char(n)

n:存儲固定長度,在括號中自定長度其最大值為255;

varchar(n)

n:存儲變長,在括號內指定最大長度其最大值為255,如果大于255則需要使用TEXT類型

TEXT

TEXT類型存放最大長度為65535個字符串。


3.2 三種類型優缺點:

char較varchar占用空間,但效率高

char:固定長度,插入數據必須小于指定的長度否則自動截斷(適用于mysql版本低于5.5的版本,大等于該版本的將不能插入數據)。

varchar:長度動態,會導致數據遷移增加IO壓力


字符串類型修飾符:

binary:區分字符大小寫。

舉例:

mysql>?create?table?mychar1(ca?char(10),va?varchar(10));
mysql>?insert?into?mychar1?values('1234567890111','1234567890111');
ERROR?1406?(22001):?Data?too?long?for?column?'ca'?at?row?1
字符過長無法插入報錯

不同存儲引擎使用不同用法:

MyISAM表:建議使用char類型

InnoDB表:由于其數據內部存儲格式對固定長度的數據行和可變長度的數據行不加區分,素有使用varchar可以減少磁盤空間用量和尖山磁盤I/O。


TEXT類型:

TEXT類型及其子類型用于存儲比較長的非二進制字符串:

TEXT不區分大小寫

四、復合類型

ENUM:枚舉類型,只能取一個

SET:set類型可以取多個


例子:

Query?OK,?1?row?affected?(0.00?sec)
mysql>?create?table?mychar(sex?enum('M','W'));
Query?OK,?0?rows?affected?(0.11?sec)
mysql>?insert?into?mychar?values('M');
Query?OK,?1?row?affected?(0.01?sec)
mysql>?create?table?mychar2(type?set('a','b','c','d'));
Query?OK,?0?rows?affected?(0.14?sec)
mysql>?insert?into?mychar2?values('a,b,d');
mysql>?select?*?from?mychar2;
+-------+
|?type??|
+-------+
|?a,b,d?|
+-------+

說明:enmu:最多有65535個元素,從1開始索引為0,表示錯誤值或nouu,


五、時間日期型:

5.1 date類型

格式:YYYY-MM-DD

支持范圍:1000-01-01到9999-12-31

mysql> create table mydate(dd date);

Query OK, 0 rows affected (0.06 sec)

mysql> insert into mydate values('2017-09-10'),(20180910);

5.2 time類型

mysql>?create?table?mydate1(tt?time);
Query?OK,?0?rows?affected?(0.15?sec)
mysql>?insert?into?mydate1?values('100101');
Query?OK,?1?row?affected?(0.01?sec)
mysql>?select?*?from?mydate1;
+----------+
|?tt???????|
+----------+
|?10:01:01?|
+----------+
1?row?in?set?(0.00?sec)


5.3 year類型

00-69:轉為2000-2069 70-79轉為:1970-1999

1970Unix誕生記為計算機元年

例子:

mysql>?create?table?mydate2(yy?year);
Query?OK,?0?rows?affected?(0.14?sec)
mysql>?insert?into?mydate2?values('2015'),(01),(9),(69),(2080);
Query?OK,?5?rows?affected?(0.08?sec)
Records:?5??Duplicates:?0??Warnings:?0
mysql>?select?*?from?mydate2;
+------+
|?yy???|
+------+
|?2015?|
|?2001?|
|?2009?|
|?2069?|
|?2080?|
+------+
5?rows?in?set?(0.00?sec)

5.4 datetime類型和time stamp類型

datetime類型timestamp類型

datetime類型能保存大范圍的值,從1001年到9999年,精度為秒,它把日期和時間封裝到格式為YYYY-MM-DD HH:MM:SS的整數中,與時區無關,使用8個字節的存儲空間

timestamp類型保存了從1970年1月1日午夜(格林尼治時間) 以來的秒數

它和linux時間戳相同,timestamp只使用了4個字節的存儲空間,因此它的范圍比datetime小的多,只能表示從1970-2038,通常我們還是用它的,提高空間利用率

舉例:

mysql>?create?table?mydate3(dt?datetime);
Query?OK,?0?rows?affected?(0.21?sec)
mysql>?insert?into?mydate3?values('11111111111111')->?;
Query?OK,?1?row?affected?(0.00?sec)
mysql>?select?*?from?mydate3;
+---------------------+
|?dt??????????????????|
+---------------------+
|?1111-11-11?11:11:11?|
+---------------------+
1?row?in?set?(0.00?sec)
插入當前時間
mysql>?insert?into?mydate4?values(now());
Query?OK,?1?row?affected?(0.01?sec)