數據類型都是啥啊 (MySQL數據類型與屬性說明)

數據類型

數據類型是數據的一種屬性,其可以決定數據的存儲格式,有效範圍和相應的限制。

mysql的數據類型分爲五種,包括整數類型,浮點數類型,日期和時間類型,字符串類型和二進制類型。

數值類型

類型 大小 範圍 無符號範圍 用途
TINYINT 1 字節 (-128,127) (0,255) 小整數值
SMALLINT 2 字節 (-32 768,32 767) (0,65 535) 大整數值
MEDIUMINT 3 字節 (-8 388 608,8 388 607) (0,16 777 215) 大整數值
INT或INTEGER 4 字節 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整數值
BIGINT 8 字節 (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 極大整數值

不必多說,存儲數字的類型,是專門用來存儲數值的,根據實際情使用對應的數值類型,唯一要注意的就是滿足要求的同時,儘量使用小字節的數據類型。

例如:創建一個表,用於統計公司人數,年齡

mysql> create table test(id smallint,age tinyint);
Query OK, 0 rows affected (0.04 sec)

mysql> desc test;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | smallint(6) | YES  |     | NULL    |       |
| age   | tinyint(4)  | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+

對於以上需求,使用mediumint就可滿足要求,但考慮類型大小,選擇了最適合的數值類型。

浮點數類型

類型 大小 範圍 無符號範圍 用途
FLOAT(M,D) 4 字節 (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 單精度,浮點數值
DOUBLE(M,D) 8 字節 (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 雙精度,浮點數值
DECIMAL(M,D) 對DECIMAL(M,D) ,如果M>D,爲M+2否則爲D+2 依賴於M和D的值 依賴於M和D的值 小數值

浮點類型後面的(M,D)中填寫的是數字,表示精度和標度。M指的是數字總個數,D指的是小數的數字個數。例如:float(5,2)表示總長度爲5,有2位小數,123.456添加進去時,基於MySQL保存值四捨五入的機制,最後保存到數據庫中的值爲123.46。

精準度

float:單精度浮點型,佔字節數爲4,用32位二進制描述,有符號是7個有效位,無符號是8個有效位

double:雙精度浮點型,佔字節數爲8,用64位二進制描述,有符號是15個有效位,無符號是16個有效位

decimal:數字型,用128位二進制描述,不存在精度損失,28個有效位。

計算機只能存儲二進制,浮點數類型在存儲的時候,必須轉化成二進制。拿float型來說,如果將一個float型數值轉化爲二進制後,若轉化的數據小於32位或32位後都是0,那麼數據是準確的,如果32位後不全爲0,則數據就會存在誤差。

精準度比較,創建一個超過float精準度範圍的表

mysql> create table test3(num1 float(10,2),num2 double(10,2),num3 decimal(10,2));

往裏面添加內容

mysql> insert into test3 values(9876543.21,9876543.21,9876543.21);

查看錶的數據

mysql> select * from test3;
+------------+------------+------------+
| num1       | num2       | num3       |
+------------+------------+------------+
| 9876543.00 | 9876543.21 | 9876543.21 |
+------------+------------+------------+

float型存儲的數值二進制超過32位後的部分不能確保精準,結果小數部分就變成了0。

日期\時間類型

類型 大小 範圍 格式 用途
DATE 3字節 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3字節 ‘-838:59:59’/‘838:59:59’ HH:MM:SS 時間值或持續時間
YEAR 1字節 1901/2155 YYYY 年份值
DATETIME 8字節 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和時間值
TIMESTAMP 4字節 1970-01-01 00:00:00/2038,結束時間是第 2147483647 秒,北京時間 2038-1-19 11:14:07,格林尼治時間 2038年1月19日 凌晨 03:14:07 YYYYMMDD HHMMSS 混合日期和時間值,時間戳

對於時間和日期類型,就很簡單,直接指定類型就可以了,連範圍都不用加。

date類型使用

創建一個日期類型的表

mysql> create table test4(date date);

添加date型數據的兩種方式

mysql> insert into test4 values('2020-2-23');
mysql> insert into test4 values(20200303);

查看記錄是否成功

mysql> select * from test4;
+------------+
| date       |
+------------+
| 2020-02-23 |
| 2020-03-03 |
+------------+

time類型使用
創建一個時間類型的表

mysql> create table test5(time time);

添加time型數據的三種方式

mysql> insert into test5 values('23:23:23');
mysql> insert into test5 values('23:23');
mysql> insert into test5 values('232323');

查看記錄

mysql> select * from test5;
+----------+
| time     |
+----------+
| 23:23:23 |
| 23:23:00 |
| 23:23:23 |
+----------+

year類型使用
創建一個年份類型的表

mysql> create table test6(year year);

添加一條記錄

mysql> insert into test6 values(2020);

查看記錄

mysql> select * from test6;
+------+
| year |
+------+
| 2020 |
+------+

datetime類型使用
範圍1001年到9999年,精確到秒,使用8個字節存儲。(建議目前使用timestamp類型)

創建一個日期加時間的表

mysql> create table test7(datetime datetime);

添加datetime型數據的兩種方式,添加格式爲:‘YYYY-MM-DD HH:MM:SS’

mysql> insert into test7 values('2020-2-22 23:23:23');
mysql> insert into test7 values(20200303222222);

查看記錄

mysql> select * from test7;
+---------------------+
| datetime            |
+---------------------+
| 2020-02-22 23:23:23 |
| 2020-03-03 22:22:22 |
+---------------------+

timestamp類型使用
範圍從1970年1月1日以來的秒數,到達2038年1月19結束。和linux時間戳相同,用4個字節存儲空間。

創建一個日期和時間的表

mysql> create table test8 (datetime timestamp);

添加timestamp型數據的兩種方式

mysql> insert into test8 values('2020-11-11 11:11:11');
mysql> insert into test8 values(20201010063030);

查看記錄是否添加成功

mysql> select * from test8;
+---------------------+
| datetime            |
+---------------------+
| 2020-11-11 11:11:11 |
| 2020-10-10 06:30:30 |
+---------------------+

字符串類型

類型 大小 用途
CHAR 0-255字節 定長字符串
VARCHAR 0-65535 字節 變長字符串
TINYTEXT 0-255字節 短文本字符串
TEXT 0-65 535字節 長文本數據
MEDIUMTEXT 0-16 777 215字節 中等長度文本數據
LONGTEXT 0-4 294 967 295字節 極大文本數據

根據需求和存儲,靈活的使用數據類型,例如,存儲名稱和簡介。

mysql> create table test9(name char(4),intro varchar(100));

添加一條記錄

mysql> insert into test9 values('張三','簡介');

查看記錄

mysql> select * from test9;
+--------+--------+
| name   | intro  |
+--------+--------+
| 張三   | 簡介   |
+--------+--------+

char和varchar區別

char定義的長度是固定的,取值爲0~255之間,若插入的數據不足,將使用空格填充,直到達到範圍。

varchar定義的長度是可變長字符串,取值爲0~65535。varchar類型只保存添加的字符,用一個字節來記錄長度,開始符一個字節,結束符一個字節,不像char使用填充符。

varchar存儲變長數據,但存儲效率沒有char高。從存儲空間考慮,用varcahr合適,從效率上考慮,用char合適。

二進制類型

類型 大小 用途
TINYBLOB 0-255字節 不超過 255 個字符的二進制字符串
BLOB 0-65 535字節 二進制形式的長文本數據
MEDIUMBLOB 0-16 777 215字節 二進制形式的中等長度文本數據
LONGBLOB 0-4 294 967 295字節 二進制形式的極大文本數據

和字符串類型類似,只不過只能存儲二進制數據。這幾種BLOB類型最大的區別就是能夠保存的最大長度不同。LONGBLOB的長度最大,TINYBLOB的長度最小。

字段屬性

屬性 用途
PRIMARY KEY 主鍵
DEFAULT 默認值
NULL 數據列可包含NULL值
NOT NULL 數據列不允許包含NULL值
INDEX 索引
AUTO_INCREMENT 自動遞增,用於數值類型
UNSIGNED 無符號
COMMENT 字段描述
UNIQUE KEY 唯一鍵
CHARACTER SET name 指定字符集
ZEROFILL 填充符改爲0,int型長度爲4,存入3的時候會添加0003
UNSIGNED 數值取值範圍翻倍,規定插入數值不能爲負數
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章