mysql支持的數據類型 [TOC] 數據類型官方文檔 數值類型 數值類型表 | 類型 | 大小 | 範圍(有符號) | 範圍(無符號)unsigned約束 | 用途 | | | | | | | | TINYINT | 1位元組 | ( 128,127) | (0,255) | 小整數值 | | SM ...
目錄
mysql支持的數據類型
- 數據類型官方文檔
數值類型
MySQL支持所有標準SQL數值數據類型。
這些類型包括嚴格數值數據類型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似數值數據類型(FLOAT、REAL和DOUBLE PRECISION)。
關鍵字INT是INTEGER的同義詞,關鍵字DEC是DECIMAL的同義詞。
MySQL支持的整數類型有TINYINT、MEDIUMINT和BIGINT。下麵的表顯示了需要的每個整數類型的存儲和範圍。
對於小數的表示,MYSQL分為兩種方式:浮點數和定點數。浮點數包括float(單精度)和double(雙精度),而定點數只有decimal一種,
在mysql中以字元串的形式存放,比浮點數更精確,適合用來表示貨幣等精度高的數據。
BIT數據類型保存位欄位值,並且支持MyISAM、MEMORY、InnoDB和BDB表。
數值類型表
類型 | 大小 | 範圍(有符號) | 範圍(無符號)unsigned約束 | 用途 |
---|---|---|---|---|
TINYINT | 1位元組 | (-128,127) | (0,255) | 小整數值 |
SMALLINT | 2位元組 | (-32768,32767) | (0,65535) | 大整數值 |
MEDIUMINT | 3位元組 | (-8388608,8388607) | (0,16777215) | 大整數值 |
INT或INTEGER | 4位元組 | (-2147483648,2147483 647) | (0,4294967295) | 大整數值 |
BIGINT | 8位元組 | (-9233372036854775808,9223372036854 775807) | (0,18446744073709551 615) | 極大整數值 |
FLOAT | 4位元組float(255,30) | (-3.402823466E+38,-1.175494351E-38),0,(1.175 494351E-38,3.402823466351E+38) | 0,(1.175494351E-38,3.402823466E+38) | 單精度浮點數值 |
DOUBLE | 8位元組double(255,30) | (-1.7976931348623157E+308,-2.225073858 5072014 E-308),0,(2.2250738585072014E-308,1.7976931348623157E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 雙精準浮點數值 |
DECIMAL | 對DECIMAL(M,D) ,如果M>D,為M+2否則為D+2double(65,30) | 依賴於M和D的值 | 依賴於M和D的值 | x小數值 |
整型的每一種都分有無符號(unsigned)和有符號(signed)兩種類型(float和double總是帶符號的),
在預設情況下聲明的整型變數都是有符號的類型(char有點特別),如果需聲明無符號類型的話就需要在類型前加上unsigned。
無符號版本和有符號版本的區別就是無符號類型能保存2倍於有符號類型的正整數數據,比如16位系統中一個int能存儲的數據的範圍為-32768~32767,
而unsigned能存儲的數據範圍則是0~65535。由於在電腦中,整數是以補碼形式存放的。根據最高位的不同,如果是1,有符號數的話就是負數;
如果是無符號數,則都解釋為正數。另外,unsigned若省略後一個關鍵字,大多數編譯器都會認為是unsigned int。
示列:
有符合的8位前面第一位是表示符號的,後邊只能顯示7位
整數 int: create table 表 (id1 int(4),id2 int(11));
int預設是有符號的
int 預設11位 整數
它能表示的數字的範圍不被寬度約束#它只能約束數字的顯示寬度
整數 int: create table 表 (id1 int unsigned,id2 int); #unsigned 指定取除int符號
小數 float: create table 表 (f1 float(5,2),d1 double(5,2)); #float單精度浮點數值 #double雙精度浮點數值 (5,2)整數,小數範圍限制
小數 float: create table 表 (f1 float,d1 double); 預設值
小數 float: create table 表(d1 decimal,d2 decimal(25,20));#decimal 小數值 預設與指定(25,20)
# 創建表一個是預設寬度的int,一個是指定寬度的int(5)
mysql> create table t1 (id1 int,id2 int(5));
Query OK, 0 rows affected (0.02 sec)
# 像t1中插入數據1,1
mysql> insert into t1 values (1,1);
Query OK, 1 row affected (0.01 sec)
# 可以看出結果上並沒有異常
mysql> select * from t1;
+------+------+
| id1 | id2 |
+------+------+
| 1 | 1 |
+------+------+
row in set (0.00 sec)
# 那麼當我們插入了比寬度更大的值,會不會發生報錯呢?
mysql> insert into t1 values (111111,111111);
Query OK, 1 row affected (0.00 sec)
# 答案是否定的,id2仍然顯示了正確的數值,沒有受到寬度限制的影響
mysql> select * from t1;
+------------+--------+
| id1 | id2 |
+------------+--------+
| 0000000001 | 00001 |
| 0000111111 | 111111 |
+------------+--------+
rows in set (0.00 sec)
# 修改id1欄位 給欄位添加一個unsigned表示無符號
mysql> alter table t1 modify id1 int unsigned;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc t1;
+-------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| id1 | int(10) unsigned | YES | | NULL | |
| id2 | int(5) | YES | | NULL | |
+-------+------------------+------+-----+---------+-------+
rows in set (0.01 sec)
# 當給id1添加的數據大於214748364時,可以順利插入
mysql> insert into t1 values (2147483648,2147483647);
Query OK, 1 row affected (0.00 sec)
# 當給id2添加的數據大於214748364時,會報錯
mysql> insert into t1 values (2147483647,2147483648);
ERROR 1264 (22003): Out of range value for column 'id2' at row 1
int整數示例
日期類型
#表示時間值的日期和時間類型為DATETIME、DATE、TIMESTAMP、TIME和YEAR。
#每個時間類型有一個有效值範圍和一個"零"值,當指定不合法的MySQL不能表示的值時使用"零"值。
#TIMESTAMP類型有專有的自動更新特性,將在後面描述。
日期類型表
類型 | 大小 (位元組) | 範圍 | 格式 | 用途 |
---|---|---|---|---|
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 | 混合日期和時間值,時間戳 |
日期類型
year 年
date 年月日
- time 時分秒
now() 函數現在時間
datetime、timestamp 年月日時分秒
create table t9(y year,d date,dt datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ts timestamp);
mysql> create table t4 (d date,t time,dt datetime);
Query OK, 0 rows affected (0.02 sec)
mysql> desc t4;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| d | date | YES | | NULL | |
| t | time | YES | | NULL | |
| dt | datetime | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
rows in set (0.01 sec)
mysql> insert into t4 values (now(),now(),now());
Query OK, 1 row affected, 1 warning (0.01 sec)
mysql> select * from t4;
+------------+----------+---------------------+
| d | t | dt |
+------------+----------+---------------------+
| 2018-09-21 | 14:51:51 | 2018-09-21 14:51:51 |
+------------+----------+---------------------+
row in set (0.00 sec)
mysql> insert into t4 values (null,null,null);
Query OK, 1 row affected (0.01 sec)
mysql> select * from t4;
+------------+----------+---------------------+
| d | t | dt |
+------------+----------+---------------------+
| 2018-09-21 | 14:51:51 | 2018-09-21 14:51:51 |
| NULL | NULL | NULL |
+------------+----------+---------------------+
rows in set (0.00 sec)
date/time/datetime示例
##################################################################
mysql> create table t5 (id1 timestamp);
Query OK, 0 rows affected (0.02 sec)
mysql> desc t5;
+-------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------+------+-----+-------------------+-----------------------------+
| id1 | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------+-----------+------+-----+-------------------+-----------------------------+
row in set (0.00 sec)
# 插入數據null,會自動插入當前時間的時間
mysql> insert into t5 values (null);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t5;
+---------------------+
| id1 |
+---------------------+
| 2018-09-21 14:56:50 |
+---------------------+
row in set (0.00 sec)
#添加一列 預設值是'0000-00-00 00:00:00'
mysql> alter table t5 add id2 timestamp;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table t5 \G;
*************************** 1. row ***************************
Table: t5
Create Table: CREATE TABLE `t5` (
`id1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`id2` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=InnoDB DEFAULT CHARSET=utf8
row in set (0.00 sec)
ERROR:
No query specified
# 手動修改新的列預設值為當前時間
mysql> alter table t5 modify id2 timestamp default current_timestamp;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table t5 \G;
*************************** 1. row ***************************
Table: t5
Create Table: CREATE TABLE `t5` (
`id1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`id2` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8
row in set (0.00 sec)
ERROR:
No query specified
mysql> insert into t5 values (null,null);
Query OK, 1 row affected (0.01 sec)
mysql> select * from t5;
+---------------------+---------------------+
| id1 | id2 |
+---------------------+---------------------+
| 2018-09-21 14:56:50 | 0000-00-00 00:00:00 |
| 2018-09-21 14:59:31 | 2018-09-21 14:59:31 |
+---------------------+---------------------+
rows in set (0.00 sec)
timestamp示例
##################################################################
mysql> create table t6 (t1 timestamp);
Query OK, 0 rows affected (0.02 sec)
mysql> desc t6;
+-------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------+------+-----+-------------------+-----------------------------+
| t1 | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------+-----------+------+-----+-------------------+-----------------------------+
row in set (0.01 sec)
mysql> insert into t6 values (19700101080001);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t6;
+---------------------+
| t1 |
+---------------------+
| 1970-01-01 08:00:01 |
+---------------------+
row in set (0.00 sec)
# timestamp時間的下限是19700101080001
mysql> insert into t6 values (19700101080000);
ERROR 1292 (22007): Incorrect datetime value: '19700101080000' for column 't1' at row 1
mysql> insert into t6 values ('2038-01-19 11:14:07');
Query OK, 1 row affected (0.00 sec)
# timestamp時間的上限是2038-01-19 11:14:07
mysql> insert into t6 values ('2038-01-19 11:14:08');
ERROR 1292 (22007): Incorrect datetime value: '2038-01-19 11:14:08' for column 't1' at row 1
mysql>
timestamp示例2
##################################################################
mysql> create table t7 (y year);
Query OK, 0 rows affected (0.02 sec)
mysql> insert into t7 values (2018);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t7;
+------+
| y |
+------+
| 2018 |
+------+
row in set (0.00 sec)
year示例
##################################################################
mysql> create table t8 (dt datetime);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into t8 values ('2018-9-26 12:20:10');
Query OK, 1 row affected (0.01 sec)
mysql> insert into t8 values ('2018/9/26 12+20+10');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t8 values ('20180926122010');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t8 values (20180926122010);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t8;
+---------------------+
| dt |
+---------------------+
| 2018-09-26 12:20:10 |
| 2018-09-26 12:20:10 |
| 2018-09-26 12:20:10 |
| 2018-09-26 12:20:10 |
+---------------------+
rows in set (0.00 sec)
datetime示例
字元串類型
字元串類型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。
該節描述了這些類型如何工作以及如何在查詢中使用這些類型。
字元串類型表
類型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255位元組 | 定長字元串 |
VARCHAR | 0-65535 位元組 | 變長字元串 |
TINYBLOB | 0-255位元組 | 不超過 255 個字元的二進位字元串 |
TINYTEXT | 0-255位元組 | 短文本字元串 |
BLOB | 0-65 535位元組 | 二進位形式的長文本數據 |
TEXT | 0-65 535位元組 | 長文本數據 |
MEDIUMBLOB | 0-16 777 215位元組 | 二進位形式的中等長度文本數據 |
MEDIUMTEXT | 0-16 777 215位元組 | 中等長度文本數據 |
LONGBLOB | 0-4 294 967 295位元組 | 二進位形式的極大文本數據 |
LONGTEXT | 0-4 294 967 295位元組 | 極大文本數據 |
定長的單位 char(15)
- char :浪費空間,存取效率相對高 長度變化小的 (優先考慮使用)
變長的單位 varchar(15)
- varchar :節省空間、存取效率相對低
create table 表(name1 char(5),name2 varchar(5));
# 手機號碼、身份證號 char
# 用戶名、密碼 char
# 評論 微博 說說 微信狀態 varchar
CHAR 和 VARCHAR 類型類似,但它們保存和檢索的方式不同。它們的最大長度和是否尾部空格被保留等方面也不同。
在存儲或檢索過程中不進行大小寫轉換。
CHAR列的長度固定為創建表是聲明的長度,範圍(0-255);而VARCHAR的值是可變長字元串範圍(0-65535)。
MySQL的varchar定義長度到底是位元組
varchar存儲規則:
4.0版本以下,varchar(20),指的是20位元組,如果存放UTF8漢字時,只能存6個(每個漢字3位元組)
5.0版本以上,varchar(20),指的是20字元,無論存放的是數字、字母還是UTF8漢字(每個漢字3位元組),
都可以存放20個,最大大小是65532位元組
Mysql4中最大也不過是20個位元組,但是Mysql5根據編碼不同,存儲大小也不同。
mysql> create table t9 (v varchar(4),c char(4));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into t9 values ('ab ','ab ');
Query OK, 1 row affected (0.00 sec)
# 在檢索的時候char數據類型會去掉空格
mysql> select * from t9;
+------+------+
| v | c |
+------+------+
| ab | ab |
+------+------+
row in set (0.00 sec)
# 來看看對查詢結果計算的長度
mysql> select length(v),length(c) from t9;
+-----------+-----------+
| length(v) | length(c) |
+-----------+-----------+
| 4 | 2 |
+-----------+-----------+
row in set (0.00 sec)
# 給結果拼上一個加號會更清楚
mysql> select concat(v,'+'),concat(c,'+') from t9;
+---------------+---------------+
| concat(v,'+') | concat(c,'+') |
+---------------+---------------+
| ab + | ab+ |
+---------------+---------------+
row in set (0.00 sec)
# 當存儲的長度超出定義的長度,會截斷
mysql> insert into t9 values ('abcd ','abcd ');
Query OK, 1 row affected, 1 warning (0.01 sec)
mysql> select * from t9;
+------+------+
| v | c |
+------+------+
| ab | ab |
| abcd | abcd |
+------+------+
rows in set (0.00 sec)
char/varchar示例
ENUM 枚舉類型
ENUM中文名稱叫枚舉類型,它的值範圍需要在創建表時通過枚舉方式顯示。ENUM只允許從值集合中選取單個值,
而不能一次取多個值。
SET和ENUM非常相似,也是一個字元串對象,裡面可以包含0-64個成員。根據成員的不同,存儲上也有所不同。
set類型可以允許值集合中任意選擇1或多個元素進行組合。對超出範圍的內容將不允許註入,而對重覆的值將進行自動去重。
枚舉類型表
類型 | 大小 | 用途 |
---|---|---|
ENUM | 對1-255個成員的枚舉需要1個位元組存儲; 對於255-65535個成員,需要2個位元組存儲; 最多允許65535個成員。 | 單選:選擇性別 |
SET | 1-8個成員的集合,占1個位元組 9-16個成員的集合,占2個位元組 17-24個成員的集合,占3個位元組 25-32個成員的集合, | |
占4個位元組 33-64個成員的集合,占8個位元組 | 多選:興趣愛好 |
create table 表(name char(12),gender ENUM('male','female'),hobby set('抽煙','喝酒','燙頭','洗腳'));
insert into t12 values('gandan','不詳','抽煙,喝酒,洗腳,洗腳,按摩');
mysql> create table t10 (name char(20),gender enum('female','male'));
Query OK, 0 rows affected (0.01 sec)
# 選擇enum('female','male')中的一項作為gender的值,可以正常插入
mysql> insert into t10 values ('goudan','male');
Query OK, 1 row affected (0.00 sec)
# 不能同時插入'male,female'兩個值,也不能插入不屬於'male,female'的值
mysql> insert into t10 values ('goudan','male,female');
ERROR 1265 (01000): Data truncated for column 'gender' at row 1
mysql> create table t11 (name char(20),hobby set('抽煙','喝酒','燙頭','翻車'));
Query OK, 0 rows affected (0.01 sec)
# 可以任意選擇set('抽煙','喝酒','燙頭','翻車')中的項,並自帶去重功能
mysql> insert into t11 values ('gandna','燙頭,喝酒,燙頭');
Query OK, 1 row affected (0.01 sec)
mysql> select * from t11;
+------+---------------+
| name | hobby |
+------+---------------+
| gandan | 喝酒,燙頭 |
+------+---------------+
row in set (0.00 sec)
# 不能選擇不屬於set('抽煙','喝酒','燙頭','翻車')中的項,
mysql> insert into t11 values ('gandan','燙頭,翻車,看妹子');
ERROR 1265 (01000): Data truncated for column 'hobby' at row 1
set/enum示例
練習題
#建表 表結構為 id name gender(性別單選) hire_day(入職日期) salary float(8,2) hobby(愛好)
create table staff(id int,name char(12),gender enum('male','female'),hire_date date,salary float(8,2),hobby set('唱','跳','rap','打籃球'))