數據類型 (詳細數據類型請參考:http://www.runoob.com/mysql/mysql-data-types.html) 數字 整型 tinyint int bigint 小數: float 在小數點後 位數比較短的情況下不精準; double 在小數點後 位數比較長的情況下不精準 字元 ...
數據類型
(詳細數據類型請參考:http://www.runoob.com/mysql/mysql-data-types.html)
數字
整型 tinyint int bigint
小數: float 在小數點後 位數比較短的情況下不精準;
double 在小數點後 位數比較長的情況下不精準
字元串
char (10):簡單粗暴,浪費空間,存取速度快
varchar:精準;節省空間,存取速度較慢
時間類型: 常用 datetime (年月日時分秒)
枚舉類型與集合類型 enum(多選一)和set(多選多)
數值類型
整數數據類型:tinyint smallint mediumint int bigint
作用:存儲年齡,等級,id,各種號碼等
範圍都顧頭顧尾
======================================== tinyint[(m)] [unsigned] [zerofill] 小整數,數據類型用於保存一些範圍的整數數值範圍: 有符號(預設): 範圍:-128 ~ 127(顧頭顧尾)
mysql> create table t1(x tinyint);
mysql> insert into t1 values(-128);
無符號:
創建表時定義記錄的字元為無符號類型,要使用unsigned 範圍: 0 ~ 255(顧頭顧尾)
mysql> create table t2(x tinyint unsigned);
mysql> insert into t2 values(255);
註意:若插入的數字範圍超過規定則會報錯.
PS: MySQL中無布爾值,使用tinyint(1)構造。 ======================================== int[(m)][unsigned][zerofill] 整數,數據類型用於保存一些範圍的整數數值範圍: 有符號: -2147483648 ~ 2147483647 無符號: 0 ~ 4294967295 ======================================== bigint[(m)][unsigned][zerofill] 大整數,數據類型用於保存一些範圍的整數數值範圍: 有符號: -9223372036854775808 ~ 9223372036854775807 無符號: 0 ~ 18446744073709551615
int類型後面的存儲是顯示寬度,而不是存儲寬度
若未達到顯示的寬度,空出的位置則會被占用,超出顯示寬度的部分正常顯示,
該寬度只是指定查詢結果的顯示寬度,與存儲範圍和類型包含的值的範圍無關.
有符號和無符號的最大數字需要的顯示寬度均為10,而針對有符號的最小值
則需要11位才能顯示完全,所以int類型預設的顯示寬度為11是非常合理的.
mysql> create table t3(id int(1) unsigned); #插入255555記錄也是可以的 mysql> insert into t3 values(255555); mysql> select * from t3; +--------+ | id | +--------+ | 255555 | +--------+
以上操作還不能夠驗證,再來一張表驗證用zerofill 用0填充 # zerofill 用0填充 mysql> create table t4(id int(5) unsigned zerofill); mysql> insert into t4 value(1); Query OK, 1 row affected (0.00 sec) #插入的記錄是1,但是顯示的寬度是00001 mysql> select * from t4; +-------+ | id | +-------+ | 00001 | +-------+ row in set (0.00 sec)
浮點型:
定點浮點型:DEC等同於DECIMAL
浮點類型: FLOAT DOUBLE
作用:儲存薪資,身高體重,體質參數等;
語法:
-------------------------FLOAT------------------- FLOAT[(M,D)] [UNSIGNED] [ZEROFILL] 參數解釋:單精度浮點數(非準確小數值),M是全長,即顯示的寬度,D是小數點後個數。M最大值為255,D最大值為30 unsigned定義為無符號型,常與zerofill搭配,若實際顯示寬度不滿足給定的寬度,則用0補充. 有符號: -3.402823466E+38 to -1.175494351E-38, 1.175494351E-38 to 3.402823466E+38 無符號: 1.175494351E-38 to 3.402823466E+38 精確度: 隨著小數的增多,精度變得不准確 ****
mysql> create table t3(x float(255,30));
Query OK,0 rows affected (0.03 sec)
mysql> create table t4(y float(255,30) unsigned zerofill);
Query OK, 0 rows affected (0.27 sec)
insert into t4 values(1.0111123111);
Query OK, 0 rows affected (0.14 sec);
mysql> desc t4;
mysql> select *from t4;
![](https://img2018.cnblogs.com/blog/1432999/201809/1432999-20180919091110552-1676978124.png)
-------------------------DOUBLE----------------------- DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL] 參數解釋: 雙精度浮點數(非準確小數值),M是全長,D是小數點後個數。M最大值為255,D最大值為30
有符號: -1.7976931348623157E+308 to -2.2250738585072014E-308 2.2250738585072014E-308 to 1.7976931348623157E+308 無符號: 2.2250738585072014E-308 to 1.7976931348623157E+308 精確度:隨著小數的增多,精度比float要高,但也會變得不准確
mysql> create table t5(x double(255,30));
Query OK, 0 row affected (0.03 sec)
--------------------DECIMAL------------------------ decimal[(m[,d])] [unsigned] [zerofill] 參數解釋:準確的小數值,M是整數部分總個數(負號不算),D是小數點後個數。 M最大值為65,D最大值為30。 精確度:隨著小數的增多,精度始終準確 對於精確數值計算時需要用此類型 decaimal能夠存儲精確值的原因在於其內部按照字元串存儲。
mysql> create table t6(x decimal(65,30));
Query OK, 0 rows affected (0.00 sec)
日期類型
date time datetime timestamp year
作用:存儲用戶註冊時間,文章發佈時間,員工入職時間,出生時間,過期時間等.語法:
YEAR YYYY(1901~2155)
mysql> create table t6(year_t year);#無論year制定何種寬度,最後預設是year(4). Query OK, 0 rows affected (0.03 sec)
mysql> insert into t8 values -> (1905), -> (2018); Query OK, 2 rows affected (0.00 sec) #插入記錄成功 Records: 2 Duplicates: 0 Warnings: 0
![](https://img2018.cnblogs.com/blog/1432999/201809/1432999-20180919094705371-1502176840.png)
DATE
YYYY-MM-DD(1000-01-01~9999-12-31)
TIME HH:MM:SS('-838:59:59'~'838:59:59') DATETIME YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59 Y)
mysql> create table t7(d date,t time,dt datetime);#d為文件或id名,date為類型.
Query OK, 0 rows affected (0.25 sec)
![](https://img2018.cnblogs.com/blog/1432999/201809/1432999-20180919095851409-1708733861.png)
註意:now()為mysql自帶函數,獲取當前類型指定的時間.
TIMESTAMP(瞭解) YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某時)
mysql> create table t10(time timestamp);
Query OK, 0 rows affected (0.06 sec)
mysql> insert into t10 values();
Query OK, 1 row affected (0.00 sec)
mysql> insert into t10 values(null);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t10;
+------+
| time |
+------+
| NULL |
| NULL |
+------+
mysql> insert into t10 values(now());
Query OK, 1 row affected (0.01 sec)
mysql> select * from t10;
+---------------------+
| time |
+---------------------+
| 2018-06-09 09:44:48 |
+---------------------+
row in set (0.01 sec)
datetime與timestamp的區別
在實際應用的很多場景中,MySQL的這兩種日期類型都能夠滿足我們的需要,存儲精度都為秒,但在某些情況下,會展現出他們各自的優劣。 下麵就來總結一下兩種日期類型的區別。 1.DATETIME的日期範圍是1001——9999年,TIMESTAMP的時間範圍是1970——2038年。 2.DATETIME存儲時間與時區無關,TIMESTAMP存儲時間與時區有關,顯示的值也依賴於時區。在mysql伺服器, 操作系統以及客戶端連接都有時區的設置。 3.DATETIME使用8位元組的存儲空間,TIMESTAMP的存儲空間為4位元組。因此,TIMESTAMP比DATETIME的空間利用率更高。 4.DATETIME的預設值為null;TIMESTAMP的欄位預設不為空(not null),預設值為當前時間(CURRENT_TIMESTAMP), 如果不做特殊處理,並且update語句中沒有指定該列的更新值,則預設更新為當前時間。
註意事項:
============註意啦,註意啦,註意啦=========== #1. 單獨插入時間時,需要以字元串的形式,按照對應的格式插入 #2. 插入年份時,儘量使用4位值 #3. 插入兩位年份時,<=69,以20開頭,比如50, 結果2050 >=70,以19開頭,比如71,結果1971 create table t12(y year); insert into t12 values (50),(71); select * from t12; +------+ | y | +------+ | 2050 | | 1971 | +------+
字元類型
詳情參考https://dev.mysql.com/doc/refman/5.7/en/char.html
註意:char和varchar括弧內的參數指的都是字元的長度
length():查看位元組數 char_length():查看字元數
char類型: 定長 ,簡單粗暴 浪費空間 存取速度快
字元長度範圍:0-255(一個中文是一個字元,utf8三個位元組)
存儲: 存儲char類型的值時,會往右填充空格來滿足寬度 例如:指定寬度為10,存>10個字元則報錯,存<10個字元則用空格填充直到湊夠10個字元存儲 檢索: 在檢索或者說查詢時,查出的結果會自動刪除尾部的空格,除非我們打開
pad_char_to_full_length SQL模式
(設置SQL模式:SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';查詢sql的預設模式:select @@sql_mode;)
vachar類型:變長,精準 節省空間,存取速度較慢
字元長度範圍:0-65535
(如果大於21845會提示用其他類型.mysql行最大限製為65535位元組,字元編碼為utf-8:https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html) 存儲: varchar類型存儲數據的真實內容,不會用空格填充,如果'ab ',尾部的空格也會被存起來 強調:varchar類型會在真實數據前加1-2Bytes的首碼,該首碼用來表示真實數據的bytes位元組數(1-2Bytes最大表示65535個數字,正好符合mysql對row的最大位元組限制,即已經足夠使用) 如果真實的數據<255bytes則需要1Bytes的首碼(1Bytes=8bit 2**8最大表示的數字為255) 如果真實的數據>255bytes則需要2Bytes的首碼(2Bytes=16bit 2**16最大表示的數字為65535) 檢索:
尾部有空格會保存下來,在檢索或者說查詢時,也會正常顯示包含空格在內的內容
char填充空格來達到規定的顯示寬度,但在查詢時不會顯示填充的部分,需要修
改sql_mode讓其現出原形.
# 創建t1表,分別指明欄位x為char類型,欄位y為varchar類型 mysql> create table t1(x char(5),y varchar(4)); #此時規定char類型的顯示寬度為5,varchar顯示寬度為4. Query OK, 0 rows affected (0.16 sec) # char存放的是5個字元,而varchar存4個字元 mysql> insert into t1 values('你誰啊 ','你誰呀 '); Query OK, 1 row affected (0.01 sec) # 在檢索時char卻不顯示填充的寬度部分,而varchar存了多少,就顯示多少 mysql> select x,char_length(x),y,char_length(y) from t1; +-----------+----------------+------------+----------------+ | x | char_length(x) | y | char_length(y) | +-----------+----------------+------------+----------------+ | 你瞅啥 | 3 | 你瞅啥 | 4 | +-----------+----------------+------------+----------------+ row in set (0.02 sec) #略施小計,讓char現原形 mysql> SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH'; Query OK, 0 rows affected (0.00 sec) #查看當前mysql的mode模式 mysql> select @@sql_mode; +-------------------------+ | @@sql_mode | +-------------------------+ | PAD_CHAR_TO_FULL_LENGTH | +-------------------------+ row in set (0.00 sec) 顯示出本有的寬度 mysql> select x,char_length(x) y,char_length(y) from t1; +-------------+------+----------------+ | x | y | char_length(y) | +-------------+------+----------------+ | 你瞅啥 | 5 | 4 | +-------------+------+----------------+ row in set (0.00 sec) 查看位元組數 char類型:3個中文字元+2個空格=11Bytes
#三個中文字元為9個位元組,之前規定的顯示寬度為5,所以要填充倆空格. varchar類型:3個中文字元+1個空格=10Bytes mysql> select x,length(x),y,length(y) from t1; +-------------+-----------+------------+-----------+ | x | length(x) | y | length(y) | +-------------+-----------+------------+-----------+ | 你誰啊 | 11 | 你誰呀 | 10 | +-------------+-----------+------------+-----------+ row in set (0.02 sec)
補充:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#常用字元串系列:char與varchar 註:雖然varchar使用起來較為靈活,但是從整個系統的性能角度來說,char數據類型的處理速度更快,有時甚至可以超出varchar處理速度的50%。因此,用戶在設計資料庫時應當綜合考慮各方面的因素,以求達到最佳的平衡 #其他字元串系列(效率:char>varchar>text) TEXT系列 TINYTEXT TEXT MEDIUMTEXT LONGTEXT BLOB 系列 TINYBLOB BLOB MEDIUMBLOB LONGBLOB BINARY系列 BINARY VARBINARY text:text數據類型用於保存變長的大字元串,可以組多到65535 (2**16 − 1)個字元。 mediumtext:A TEXT column with a maximum length of 16,777,215 (2**24 − 1) characters. longtext:A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 − 1) characters.View Code
枚舉類型和集合類型
欄位的值只能在給定範圍中選擇,如單選框,多選框
enum 單選 只能在給定的範圍內選一個值,如性別 sex 男 male/女 female
set 多選 在給定的範圍內可以選擇一個或一個以上的值(愛好1,愛好2...)
mysql> create table consumer( -> id int, -> name varchar(50), -> sex enum('male','female','other'), -> level enum('vip1','vip2','vip3','vip4'),#在指定範圍內,多選一 -> fav set('play','music','read','study') #在指定範圍內,多選多 -> ); Query OK, 0 rows affected (0.03 sec) mysql> insert into consumer values -> (1,'趙雲','male','vip2','read,study'), -> (2,'趙雲2','other','vip4','play'); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> select * from consumer; +------+---------+-------+-------+------------+ | id | name | sex | level | fav | +------+---------+-------+-------+------------+ | 1 | 趙雲 | male | vip2 | read,study | | 2 | 趙雲2 | other | vip4 | play | +------+---------+-------+-------+------------+ rows in set (0.00 sec)
完整性約束
簡述
約束條件與數據類型的寬度一樣,都是可選參數
作用: 用於保證數據完整性和一致性
主要分為:
PRIMARY KEY (PK) #標識該欄位為該表的主鍵,可以唯一的標識記錄 FOREIGN KEY (FK) #標識該欄位為該表的外鍵 NOT NULL #標識該欄位不能為空 UNIQUE KEY (UK) #標識該欄位的值是唯一的 AUTO_INCREMENT #標識該欄位的值自動增長(整數類型,而且為主鍵) DEFAULT #為該欄位設置預設值 UNSIGNED #無符號 ZEROFILL #使用0填充
說明:
#1. 是否允許為空,預設NULL,可設置NOT NULL,欄位不允許為空,必須賦值 #2. 欄位是否有預設值,預設的預設值是NULL,如果插入記錄時不給欄位賦值,此欄位使用預設值 sex enum('male','female') not null default 'male' #必須為正值(無符號) 不允許為空 預設是20 age int unsigned NOT NULL default 20 # 3. 是否是key 主鍵 primary key 外鍵 foreign key 索引 (index,unique...)
not null與default
是否可空 ,null表示空 , 非字元串
not null 不可空 null 可空(一般不寫出來)
預設值,創建列時可以指定預設值,當插入數據時如果未主動設置,則自動添
加預設值.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
預設為空示例 mysql> create table t11(id int);# id欄位預設可以為空 Query OK, 0 rows affected (0.05 sec) mysql> desc t11; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ row in set (0.03 sec) mysql> insert into t11 values(); #給t11表插一個空的值 Query OK, 1 row affected (0.00 sec) #查詢結果如下 mysql> select * from t11; +------+ | id | +------+ | NULL | +------+ row in set (0.00 sec) 不為空示例 mysql> create table t12(id int not null);#設置欄位id不為空 Query OK, 0 rows affected (0.03 sec) mysql> desc t12; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | NO | | NULL | | +-------+---------+------+-----+---------+-------+ row in set (0.01 sec) mysql> insert into t12 values();#不能插入空 ERROR 1364 (HY000): Field 'id' doesn't have a default value 若為空,則設置預設值 第一種情況 mysql> create table t13(id int default 1);#若為空欄位,則設置id欄位預設值為1. Query OK, 0 rows affected (0.03 sec) mysql> desc t13; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | YES | | 1 | | +-------+---------+------+-----+---------+-------+ row in set (0.01 sec) mysql> insert into t13 values();#為空欄位,預設插入default指定值 1. Query OK, 1 row affected (0.00 sec) mysql> select * from t13; +------+ | id | +------+ | 1 | +------+ row in set (0.00 sec) # 第二種情況 mysql> create table t14(id int not null default 2);#同上一種情況,只是寫上了not null. Query OK, 0 rows affected (0.02 sec) mysql> desc t14; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | NO | | 2 | | +-------+---------+------+-----+---------+-------+ row in set (0.01 sec) mysql> select * from t14; +----+ | id | +----+ | 2 | +----+ row in set (0.00 sec) 設置id欄位有預設值後,則無論id欄位是null還是not null,都可以插入空,插入空預設填入default指定的預設值View Code
unique 單列唯一
假如:創建一個公司部門表,每個部門只能創建一個,但是在操作中卻能創建
多個,這是不符合邏輯的.那麼就可以使用unique,來對公司部門的欄位進行
約束設置.
#第一種創建unique的方式 create table department( id int unique, name char(10) unique #若後面插入的名字重覆,則會報錯. ); insert into department values(1,'it'),(2,'sale'); #第二種創建unique的方式 create table department( id int, name char(10) , unique(id), unique(name) ); insert into department values(1,'it'),(2,'sale');
聯合唯一:
只要被聯合的欄位有一列不同,則符合聯合唯一的約束.
primary key (主鍵)
一個表中可以單列做主鍵 或多列做主鍵(符合主鍵)
約束:等價於 not null unique,欄位的值不為空且唯一
存儲引擎預設是 innodb:對於innodb存儲來說,一張表必須有一個主鍵.
單列主鍵
# 創建t14表,為id欄位設置主鍵,唯一的不同的記錄 create table t14( id int primary key, name char(16) ); insert into t14 values (1,'xiaoma'), (2,'xiaohong'); mysql> insert into t14 values(2,'wxxx'); ERROR 1062 (23000): Duplicate entry '6' for key 'PRIMARY' # not null + unique,相當於給id設置primary key create table t15( id int not null unique, name char(16) ); mysql> create table t15( -> id int not null unique, -> name char(16) -> ); Query OK, 0 rows affected (0.01 sec) mysql> desc t15; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | id |