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的長度最小。

複合類型

類型 大小 用途
enum 1字節 枚舉,只能從enum()中取單一值
set 1字節 只能從set()取值

enum
枚舉,只允許添加enum()中的數據,創建一個表,有id,姓名和性別字段。

mysql> create table test(id int(10),name char(5),sex enum('man','woman'));

查看結構

mysql> desc test;
+-------+---------------------+------+-----+---------+-------+
| Field | Type                | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| id    | int(10)             | YES  |     | NULL    |       |
| name  | char(5)             | YES  |     | NULL    |       |
| sex   | enum('man','woman') | YES  |     | NULL    |       |
+-------+---------------------+------+-----+---------+-------+

向表中添加記錄,若sex不是man或woman,數據庫就會報錯

mysql> insert into test values(1,'張三','m');
ERROR 1265 (01000): Data truncated for column 'sex' at row 1

按要求插入記錄,並查看是否成功·

mysql> insert into test values(1,'張三','man');
mysql> insert into test values(1,'李莉','woman');
mysql> select * from test;
+------+--------+-------+
| id   | name   | sex   |
+------+--------+-------+
|    1 | 張三   | man   |
|    1 | 李莉   | woman |
+------+--------+-------+

set
只能從set()中取值,插入其他值就會報錯。

創建一個表,有id,姓名,值字段

mysql> create table test(id int(5),name char(5),type set('開發','測試','運維'));

查看錶結構,其中只有三個值選擇

mysql> desc test;
+-------+---------------------------------+------+-----+---------+-------+
| Field | Type                            | Null | Key | Default | Extra |
+-------+---------------------------------+------+-----+---------+-------+
| id    | int(5)                          | YES  |     | NULL    |       |
| name  | char(5)                         | YES  |     | NULL    |       |
| type  | set('開發','測試','運維')       | YES  |     | NULL    |       |
+-------+---------------------------------+------+-----+---------+-------+

插入其他數據就會報錯

mysql> insert into test values(1,'張三','人事');
ERROR 1265 (01000): Data truncated for column 'type' at row 1

插入範圍內的數據,查看記錄

mysql> insert into test values(1,'張三','開發');
mysql> insert into test values(2,'李四','測試');
mysql> insert into test values(3,'王五','運維');
mysql> select *from test;
+------+--------+--------+
| id   | name   | type   |
+------+--------+--------+
|    1 | 張三   | 開發   |
|    2 | 李四   | 測試   |
|    3 | 王五   | 運維   |
+------+--------+--------+

enum常用於性別字段,set常用於職位字段。

字段屬性

屬性 用途
PRIMARY KEY 主鍵
DEFAULT 默認值
NULL 數據列可包含NULL值
NOT NULL 數據列不允許包含NULL值
AUTO_INCREMENT 自動遞增,用於數值類型
COMMENT 字段描述
UNIQUE KEY 唯一鍵
CHARACTER SET name 指定字符集
ZEROFILL 填充符改爲0,int型長度爲4,存入3的時候會添加0003
UNSIGNED 無符號,數值取值範圍翻倍,規定插入數值不能爲負數

primary key和unique key

primary key:叫做主鍵,也稱爲主鍵約束,是表中唯一標識每條記錄的列,對錶實施完整性約束。其作用就是使表中不含有重複的記錄。

特點:
一個表中只能定義一個主鍵屬性。
主鍵值必須唯一標識表中的記錄,即主鍵數據表中唯一,不可能存在兩行相同的主鍵值。
主鍵字段的數據不能爲空(null)

unique key:叫做唯一鍵,用來保證字段中數據的唯一性,字段不能重複。

特點:
唯一鍵在一張表中可以存在多個。
唯一鍵允許字段類型爲null,並且可以添加多個爲null的記錄。

創建一個表,有id,姓名,電話號碼字段,其中id爲主鍵,電話號碼爲唯一鍵。

mysql> create table test(id int(10) primary key,name char(5),phone int(10) unique key);

查看錶結構

mysql> desc test;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(10) | NO   | PRI | NULL    |       |
| name  | char(5) | YES  |     | NULL    |       |
| phone | int(10) | YES  | UNI | NULL    |       |
+-------+---------+------+-----+---------+-------+

向表中添加記錄,除主鍵外(主鍵不能爲null),其他字段都可添加null。

mysql> insert into test values(null,null,null);
ERROR 1048 (23000): Column 'id' cannot be null
mysql> insert into test values(1,null,null);

查看添加的記錄

mysql> select * from test;
+----+------+-------+
| id | name | phone |
+----+------+-------+
|  1 | NULL |  NULL |
+----+------+-------+

not null和null

not null爲非空約束,在字段中使用not null,用戶添加記錄時如果沒有添加數據,數據庫就會報錯。null表示該字段可以爲空,用戶添加記錄時沒有添加數據,就會以null填充,字段默認屬性爲null。

空值是不佔用空間的,mysql中的null是佔用空間的,就像是一個空容器一樣。

創建一個表,有id,姓名,年齡字段,其中只有null爲空值。

mysql> create table test1(id int(10),name char(5) not null,age tinyint(3) not null);

沒有爲id字段指定屬性,默認屬性爲null,其他字段使用非空約束。

mysql> desc test1;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id    | int(10)    | YES  |     | NULL    |       |
| name  | char(5)    | NO   |     | NULL    |       |
| age   | tinyint(3) | NO   |     | NULL    |       |
+-------+------------+------+-----+---------+-------+

在其中添加記錄,在有非空約束屬性的字段中不添加數據會產生報錯,而null屬性的字段並不受影響。

mysql> insert into test1 values(null,null,23);
ERROR 1048 (23000): Column 'name' cannot be null
mysql> insert into test1 values(null,'張三',23);

這裏不添加任何數據,並不是可以直接省略id字段,在數據庫中的空值也是有值的,那就是null。查看記錄是否插入成功。

mysql> select * from test1;
+------+--------+-----+
| id   | name   | age |
+------+--------+-----+
| NULL | 張三   |  23 |
+------+--------+-----+

default

default是默認值約束,用來指定某字段的默認值,如果用戶沒有爲字段插入數據,則以默認值填充,默認值爲null。

創建一個表,有id和姓名字段,其中姓名字段指定默認值

mysql> create table test2(id int(10),name char(5) default '機密');

查看錶結構,Default就是字段的默認值,其中姓名字段默認值爲機密

mysql> desc test2;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(10) | YES  |     | NULL    |       |
| name  | char(5) | YES  |     | 機密    |       |
+-------+---------+------+-----+---------+-------+

只對id字段添加數據

mysql> insert into test2 (id)values(1);

查看插入的記錄

mysql> select * from test2;
+------+--------+
| id   | name   |
+------+--------+
|    1 | 機密   |
+------+--------+

comment

comment用來爲字段和表添加註釋,在字段或表屬性的最後添加。

例如:create table (***)comment ‘測試’;
這就是爲表添加字段

創建一個表,有id和姓名字段,併爲id字段和表添加註釋。

mysql> create table test3 (id int(3) primary key comment '員工數量',name char(10))comment '員工信息';

對於描述的查看,並不會在表中或結構中顯示,只能通過查詢SQL語句中查看

mysql> show create table test3\G
*************************** 1. row ***************************
       Table: test3
Create Table: CREATE TABLE `test3` (
  `id` int(3) NOT NULL COMMENT '員工數量',
  `name` char(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='員工信息'

auto_increment

auto_increment爲數值型字段的自動增長, 表明mysql應該自動爲該字段生成一個唯一沒有用過的數(如果一條記錄id爲1,那麼刪除1,新添加的會是2)。只適用於整數類型的字段,數值從1開始,每增加一條記錄,系統默認加1,不需要手動插入。

auto_increment常用於記錄的計數字段,員工人數,記錄條數等按順序加1的字段。

創建一個表,有id,姓名字段,id字段爲主鍵,並且設置自動遞增。

mysql> create table test4(id int(10) primary key auto_increment,name char(5));

查看錶的結構,Extra下面就是自動遞增

mysql> desc test4;
+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| id    | int(10) | NO   | PRI | NULL    | auto_increment |
| name  | char(5) | YES  |     | NULL    |                |
+-------+---------+------+-----+---------+----------------+

只爲name字段添加三條記錄

mysql> insert into test4 (name)values('張三'),('李四'),('王五');

查詢記錄

mysql> select *from test4;
+----+--------+
| id | name   |
+----+--------+
|  1 | 張三   |
|  2 | 李四   |
|  3 | 王五   |
+----+--------+

zerofill與unsigned

可以轉到===>傳送<===查看。

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