數據類型
數據類型是數據的一種屬性,其可以決定數據的存儲格式,有效範圍和相應的限制。
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 | 數值取值範圍翻倍,規定插入數值不能爲負數 |