mysql數據庫數據類型

         Mysql中不同的數據類型決定了mysql在存儲他們時使用的方式以及在運算時選擇的運算符,mysql支持的數據類型有多種,主要有數值類型、時間/日期類型和字符串類型。

1、數值類型

(1)整數類型

         Mysql中不僅支持標準SQL中的integer和smallint類型,還支持一些自己的擴展的整數類型,常用的整數類型有TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)、BIGINT,整數類型的屬性字段可以添加”AUTO_INCREMENT”自增約束條件。常用的整數類型如下:

類型名稱

說明

大小

有符號取值範圍

無符號取值範圍

TINYINT

很小整數

1字節

-128~127

0~255

SMALLINT

小整數

2字節

-32768~32767

0~65535

MEDIUMINT

中等大小整數

3字節

-8388608~8388607

0-16777125

INT(integer)

普通大小整數

4字節

-2147483648-2147483674

0-4294967295

BIGINT

大整數

8字節

 

 

         MySQL可以爲整數類型指定寬度,這個限制對大多數應用沒有意義,因爲這不是限制值的合法範圍,對於存儲和計算來說,INT(1)和INT(20)是相同的,只是對一些MySQL的交互工具規定了顯示字符的個數,比如MySQL命令行客戶端。

(2)固定浮點類型

         Decimal數據類型用來存儲高精度數據,一般只在對小數進行精確計算時才使用;numeric和decimal的含義相同。

         Decimal的使用方法爲DECIMAL[(M[,D])] [UNSIGNED];其中M代表精度表示可以使用多少位的數字,N代表小數點後的小數位數。但不需要小數時可以使用decimal(m),decimal(m,0)表示。M的最大取值範圍是65,N的最大取值範圍是30,當D爲0時可以用來存儲比BIGINT更大範圍的整數值;當指定UNSIGEND時表示不允許負數。

(3)浮點類型

         浮點類型中包含float和double兩種,與decimal相比是不精確類型,浮點型數據類型如下:

類型

說明

大小

FLOAT

單精度浮點數

4字節

DOUBLE

雙精度浮點數

8字節

DECLIMAL

壓縮的”嚴格”定點數

M+2個字節

         浮點類型float和double的用法同Decimal用法相同,在存儲同樣範圍的值時,通常比decimal使用更少的空間。Float和double在不指定精度時,默認會按照實際的精度(由操作系統和系統決定)。

mysql> create table temp2(id float(10,2),id2 double(10,2),id3 decimal(10,2));
mysql> insert into temp2 values(1234567.21, 1234567.21,1234567.21),(9876543.12, 9876543.12, 9876543.12);
Records: 2  Duplicates: 0  Warnings: 0
mysql> select * from temp2;
+------------+------------+------------+
| id         | id2        | id3        |
+------------+------------+------------+
| 1234567.25 | 1234567.21 | 1234567.21 |
| 9876543.00 | 9876543.12 | 9876543.12 |
+------------+------------+------------+

2、日期與時間類型

         日期時間類型包括date,time,datetime,timestamp和year,用來指定不同範圍的日期或時間值,主要的時間類型如下:

類型名稱

作用

日期格式

範圍

大小

YEAR

表示年

YYYY

1901-2155

1字節

TIME

表示時間

HH:MM:SS

-838:59:59~838:59:59

3字節

DATE

表示日期

YYYY-MM-DD

1000-01~9999-12-3

3字節

DATETIME

表示日期和時間

YYYY-MM-DD HH:MM:SS

1000-01-01 00:00:00~9999-12-31 23:59:59

8字節

TIMESTAMP

表示日期和時間

YYYY-MM-DD HH:MM:SS

1970-01-01 00:00:01 UTC~ 2038-01-19 03:14:07 UTC

4字節

         Timestamp和datetime日期時間類型可以被自動初始化和更新爲當前的日期時間數據,當默認指定current timestamp爲默認值,或者指定此數據列爲自動更新時(指定默認值是指當插入新的數據而該列沒有顯視指定數值時,則插入當前日期時間值;指定自動更新是指當行中的其他列被更新時,則此列被自動更新爲當前日期時間值)

# timestamp不指定日期時插入當前的默認日期
mysql> create table temp3(id int,tstamp datetime,tstamp2 timestamp);
mysql> insert into temp3(id) value(1);
mysql> select * from temp3;
+------+--------+---------------------+
| id   | tstamp | tstamp2             |
+------+--------+---------------------+
|    1 | NULL   | 2018-09-29 03:02:51 |
+------+--------+---------------------+
# timestamp的日期時間會自動更新;datetime指定默認時間時會自動插入當前時間,使用update current_timestamp時會自動跟新爲當前時間
mysql> create table temp4(id int,tstamp datetime default current_timestamp on update current_timestamp,tstamp2 datetime default current_timestamp ,tstamp3 timestamp,tstamp4 timestamp default current_timestamp on update current_timestamp);
mysql> insert into temp4(id) value(1);
mysql> select * from temp4;
+------+---------------------+---------------------+---------------------+---------------------+
| id   | tstamp              | tstamp2             | tstamp3             | tstamp4             |
+------+---------------------+---------------------+---------------------+---------------------+
|    1 | 2018-09-29 03:20:43 | 2018-09-29 03:20:43 | 2018-09-29 03:20:43 | 2018-09-29 03:20:43 |
+------+---------------------+---------------------+---------------------+---------------------+
mysql> update temp4 set id=2 where id=1;
mysql> select * from temp4;
+------+---------------------+---------------------+---------------------+---------------------+
| id   | tstamp              | tstamp2             | tstamp3             | tstamp4             |
+------+---------------------+---------------------+---------------------+---------------------+
|    2 | 2018-09-29 03:23:25 | 2018-09-29 03:20:43 | 2018-09-29 03:23:25 | 2018-09-29 03:23:25 |
+------+---------------------+---------------------+---------------------+---------------------+

         當在time,timestamp,datetime中指定含有毫秒微秒數值時,則用type_name(fsp)來表達,其中fsp可以取0到6之間的數值

mysql> create table frac_test(test1 TIME(2),test2 DATETIME(2),test3 TIMESTAMP(3));
mysql> INSERT INTO frac_test VALUES('17:51:04.777', '2014-09-08 17:51:04.777', '2014-09-08 17:51:04.777');
mysql> SELECT * from frac_test;
+-------------+------------------------+-------------------------+
| test1       | test2                  | test3                   |
+-------------+------------------------+-------------------------+
| 17:51:04.78 | 2014-09-08 17:51:04.78 | 2014-09-08 17:51:04.777 |
+-------------+------------------------+-------------------------+

3、字符類型

         字符類型主要用來存儲字符數據,字符類型包含char, varchar, binary, varbinary, blob, text, enum和set,字符類型及屬性如下:

類型

說明

需求

CHAR(M)

固定長度的非二進制字符串

M字節,1<=M<=255

VARCHAR(M)

變長的非二進制字符串

L+1字節,L<=M,1<=M<=255

TINYTEXT

非常小的非二進制字符串

L+1字節,L<2^8

TEXT

小得非二進制字符串

L+2字節,L<2^16

MEDIUMTEXT

中等大小的非二進制字符串

L+3字節,L<2^24

LONGTEXT

大的非二進制字符串

L+4字節,L<2^32

ENUM

枚舉類型,只能有一個枚舉字符串值

1或2個字節,取決於枚舉值得數目(最大65535)

SET

字符串對象可有0個或多個SET成員

1、2、3、4、8個字節,取決於集合成員的數量(最多64個成員)

         Char類型的長度一旦指定就固定了,其範圍可以是0到255,當被存儲時,未達到指定長度的則在值右邊填充空格,而獲取數據時則會把右側的空格去掉;char適合存儲很短的字符串,或者所有值都接近同一個長度。對於經常變更的數據,char也比varchar更好,因爲定長的char類型不容易產生碎片。而且對非常短的字符串,char不需要一個額外的字節記錄長度。

         Varchar類型是變長的類型,其範圍可以是0到65535,當存儲時未達到指定長度則不填充空格;同時varchar需要使用1或2個額外字節記錄字符串的長度,如果列的最大長度小於等於255字節時,需要1個字節,否則需要2個字節;varchar節省了存儲空間,所以對性能也有幫助。但由於行是變長的,在update時可能使行變得比原來更長,這就導致需要做額外的工作。如果一行佔用的空間增長,並且物理數據頁內沒有更多空間存儲時,MyISAM會將行拆成不同的片段存儲,InnoDB需要分列頁來講行放到數據頁裏。

mysql> CREATE TABLE char_test(test1 VARCHAR(4),test2 CHAR(4)); 
mysql> INSERT INTO char_test VALUES('abc ','abc ');  
mysql> mysql> SELECT CONCAT('(',test1,')'),CONCAT('(',test2,')') from char_test;
+-----------------------+-----------------------+
| CONCAT('(',test1,')') | CONCAT('(',test2,')') |
+-----------------------+-----------------------+
| (abc )                | (abc)                 |
+-----------------------+-----------------------+

4、二進制類型

         Binary和varbinary類型和char/varchar類似,用來存儲二進制字符

5、大數據類型

         Blob和text類型被用來存儲大量的數據,Blob和text的列字段不能含有默認值

         Blob是用來存儲二進制的大量數據,其有四種類型:tinyblob、blob、mediumblob、longblob

         Text是用來存儲字符型的大量數據,其有四種類型: tinytext、text、mediumtext、longtext

6、枚舉類型

         Enum枚舉類型是字符串類型,其值是從事先指定的一系列值中選出,適用在某列的取值範圍已經固定,在存儲此類數據時,直接轉化成數字存儲而不是字符串,可以節省空間,並且在表的.frm文件中存儲“數字-字符串”之間的對應關係。

mysql> CREATE TABLE enum_test(name VARCHAR(40),size ENUM('x-small','small','medium','large','x-large'));
mysql> INSERT INTO enum_test(name,size) VALUES('dayi123','medium'),('dayi','small'),('hhh','x-large');
mysql> select size+0 from enum_test;
+--------+
| size+0 |
+--------+
|      3 |
|      2 |
|      4 |
+--------+

         枚舉類型的排序規則是按照存儲順序進行而不是按照值本身排序,如果想要按照一般的排序規則進行排序,需要使用field()函數顯示指定排序規則

mysql> select * from enum_test order by size;
+---------+--------+
| name    | size   |
+---------+--------+
| dayi    | small  |
| dayi123 | medium |
| hhh     | large  |
+---------+--------+
mysql> select * from enum_test order by field(size,'medium','large','small');
+---------+--------+
| name    | size   |
+---------+--------+
| dayi123 | medium |
| hhh     | large  |
| dayi    | small  |
+---------+--------+

         枚舉類型字段的取值的增加必須通過alter table命令:

mysql> alter table enum_test modify size ENUM('x-small', 'small', 'medium', 'large', 'x-large','big');

         Enum枚舉類型最多可以有65535個值,當插入數字到枚舉類型字段時,數字會被當做枚舉值的第幾個值而插入,當插入一個非法的值到枚舉字段時,則會報錯,如果枚舉字段允許NULL,則NULL值爲此枚舉類型的默認值。

7、集合類型

         Set集合類型是字符類型,可以含有0個或多個值,其中的每個值都需要在創建字段時指定的集合中,Set集合最大可以有255個值,MySQL在存儲set集合時,同樣也是存儲爲數字類型。集合時無序的。

mysql> CREATE TABLE set_test(set_col SET('a','b','c','d','e'));
mysql> INSERT INTO set_test(set_col) VALUES('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
mysql> SELECT * FROM set_test;
+---------+
| set_col |
+---------+
| a,d     |
| a,d     |
| a,d     |
| a,d     |
| a,d     |
+---------+

8、數據類型的選擇

(1)選擇小的數據類型

         儘量使用可以正確存儲數據的最小數據類型。更小的數據類型通常更快,因爲它們佔用更小的磁盤、內存和CPU緩存,並且處理時需要的CPU時間也更少

(2)選擇簡單的

         簡單的數據類型操作通常需要更少的CPU週期。

(3)避免null

         因爲如果查詢中包含可爲NULL的列,對MySQL來說更難優化,因爲NULL的列使得索引、索引統計和值比較都更爲複雜。當可爲NULL的列被索引時,每個索引記錄需要一個額外的字節,所以會使用更多的存儲空間

9、數據庫的設計方法與工具

(1)設計方法

         E-R模型,第三範式

(2)設計工具

         Powerdesigner、workbench

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章