引用
- 整型
| 數(shù)據(jù)類型 | 字節(jié)數(shù) | 帶符號最小值 | 帶符號最大值 | 不帶符號最小值 | 不帶符號最大值 |
|---|---|---|---|---|---|
| TINYINT | 1 | -128 | 127 | 0 | 255 |
| SMALLINT | 2 | -32768 | 32767 | 0 | 65535 |
| MEDIUMINT | 3 | -8388608 | 8388607 | 0 | 16777215 |
| INT | 4 | -2147483648 | 2147483647 | 0 | 4294967295 |
| BIGINT | 8 | -9223372036854775808 | 9223372036854775807 | 0 | 18446744073709551616 |
-
整型(N)形式
在開發(fā)中,我們會碰到有些定義整型的寫法是int(11),這種寫法從我個人開發(fā)的角度看我認為是沒有多大用,不過作為一個知識點做一下講解吧。
int(N)我們只需要記住兩點:- 無論N等于多少,int永遠占4個字節(jié)
- N表示的是顯示寬度,不足的用0補足,超過的無視長度而直接顯示整個數(shù)字,但這要整型設(shè)置了unsigned zerofill才有效
-
常用SQL語句
-- 如果存在就刪除表 drop table if exists test_int; -- 新建數(shù)據(jù)表 create table test_int ( a int(5) , b int(5) unsigned, c int(5) unsigned zerofill, ) engine=innodb charset=utf8; -- 插入數(shù)據(jù) insert into test_int values(1,2,3); -- 刪除數(shù)據(jù) delete from test_int where a = 1; -- 更新數(shù)據(jù) update test_int set b = 6 where a= 1; -- 查詢數(shù)據(jù) select * from test_int;
- 浮點型
| 數(shù)據(jù)類型 | 字節(jié)數(shù) | 備注 |
|---|---|---|
| float | 4 | 單精度浮點型 |
| double | 8 | 雙精度浮點型 |
| decimal | 定點型 |
-
float(M,D)、double(M、D)的用法規(guī)則
- 前面的M指定了總的位數(shù),后面的D指定了小數(shù)的位數(shù),所以整數(shù)位數(shù)為M-D
- D表示浮點型數(shù)據(jù)小數(shù)點之后的精度,假如超過D位則四舍五入,即1.233四舍五入為1.23,1.237四舍五入為1.24
- M表示浮點型數(shù)據(jù)總共的位數(shù),D=2則表示總共支持五位,即小數(shù)點前只支持三位數(shù)
- 不指定M、D的時候,會按照實際的精度來處理
-
decimal和float/double的區(qū)別,主要體現(xiàn)在兩點上:
- float/double在db中存儲的是近似值,而decimal則是以字符串形式進行保存的
- decimal(M,D)的規(guī)則和float/double相同,但區(qū)別在float/double在不指定M、D時默認按照實際精度來處理而decimal在不指定M、D時默認為decimal(10, 0)
-
常用SQL語句
-- 新建數(shù)據(jù)表 create table if not exists test_float ( f float(5,2), d double(5,3), ) engine=innodb charset=utf8; -- 插入數(shù)據(jù) insert into test_float values(1.23,1.234); -- 刪除數(shù)據(jù) delete from test_float where f >= 1.23; -- 更新數(shù)據(jù) update test_float set d = 2.234 where f >= 1.23; -- 查詢數(shù)據(jù) select * from test_float;
- 日期類型
| 日期時間類型 | 占用空間 | 日期格式 | 最小值 | 最大值 | 零值表示 |
|---|---|---|---|---|---|
| DATETIME | 8 bytes | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 | 9999-12-31 23:59:59 | 0000-00-00 00:00:00 |
| TIMESTAMP | 4 bytes | YYYY-MM-DD HH:MM:SS | 19700101080001 | 2038 年的某個時刻 | 00000000000000 |
| DATE | 3 bytes | YYYY-MM-DD | 1000-01-01 | 9999-12-31 | 0000-00-00 |
| TIME | 3 bytes | HH:MM:SS | -838:59:59 | 838:59:59 | 00:00:00 |
| YEAR | 1 bytes | YYYY | 1901 | 2155 | 0000 |
DATETIME
DATETIME 用于表示 年月日 時分秒,是 DATE 和 TIME 的組合,并且記錄的年份(見上表)比較長久。如果實際應(yīng)用中有這樣的需求,就可以使用 DATETIME 類型。TIMESTAMP
TIMESTAMP 用于表示 年月日 時分秒,但是記錄的年份(見上表)比較短暫。
TIMESTAMP 和時區(qū)相關(guān),更能反映當前時間。當插入日期時,會先轉(zhuǎn)換為本地時區(qū)后再存放;當查詢?nèi)掌跁r,會將日期轉(zhuǎn)換為本地時區(qū)后再顯示。所以不同時區(qū)的人看到的同一時間是 不一樣的。
表中的第一個 TIMESTAMP 列自動設(shè)置為系統(tǒng)時CURRENT_TIMESTAMP)。當插入或更新一行,但沒有明確給 TIMESTAMP 列賦值,也會自動設(shè)置為當前系統(tǒng)時間。如果表中有第二個 TIMESTAMP 列,則默認值設(shè)置為0000-00-00 00:00:00。
TIMESTAMP 的屬性受 Mysql 版本和服務(wù)器 SQLMode 的影響較大。
如果記錄的日期需要讓不同時區(qū)的人使用,最好使用 TIMESTAMP。DATE
DATE 用于表示 年月日,如果實際應(yīng)用值需要保存 年月日 就可以使用 DATE。TIME
TIME 用于表示 時分秒,如果實際應(yīng)用值需要保存 時分秒 就可以使用 TIME。YEAR
YEAR 用于表示 年份,YEAR 有 2 位(最好使用4位)和 4 位格式的年。 默認是4位。如果實際應(yīng)用只保存年份,那么用 1 bytes 保存 YEAR 類型完全可以。不但能夠節(jié)約存儲空間,還能提高表的操作效率。-
如需存儲時間戳,可用BIGINT保存指定時間的毫秒值。
-- 新建數(shù)據(jù)表 create table if not exists test_datetime ( date0 date, time0 time, year0 year, timestamp0 timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP(), datetime0 datetime, create_time timestamp default current_timestamp comment "創(chuàng)建時間", update_time timestamp default current_timestamp on update current_timestamp comment "修改時間", ) engine=innodb charset=utf8; -- 插入數(shù)據(jù) insert into test_datetime values(now(),now(),now(),now(),now()); -- 刪除數(shù)據(jù) delete from test_datetime where date0 < now();
- 字符串
| 類型 | 大小 | 用途 |
|---|---|---|
| CHAR | 0-255字節(jié) | 定長字符串 |
| VARCHAR | 0-65535 字節(jié) | 變長字符串 |
| TINYBLOB | 0-255字節(jié) | 不超過 255 個字符的二進制字符串 |
| TINYTEXT | 0-255字節(jié) | 短文本字符串 |
| BLOB | 0-65 535字節(jié) | 二進制形式的長文本數(shù)據(jù) |
| TEXT | 0-65 535字節(jié) | 長文本數(shù)據(jù) |
| MEDIUMBLOB | 0-16 777 215字節(jié) | 二進制形式的中等長度文本數(shù)據(jù) |
| MEDIUMTEXT | 0-16 777 215字節(jié) | 中等長度文本數(shù)據(jù) |
| LONGBLOB | 0-4 294 967 295字節(jié) | 二進制形式的極大文本數(shù)據(jù) |
| LONGTEXT | 0-4 294 967 295字節(jié) | 極大文本數(shù)據(jù) |
-
區(qū)別
CHAR 和 VARCHAR 類型類似,但它們保存和檢索的方式不同。它們的最大長度和是否尾部空格被保留等方面也不同。在存儲或檢索過程中不進行大小寫轉(zhuǎn)換。
BINARY 和 VARBINARY 類似于 CHAR 和 VARCHAR,不同的是它們包含二進制字符串而不要非二進制字符串。也就是說,它們包含字節(jié)字符串而不是字符字符串。這說明它們沒有字符集,并且排序和比較基于列值字節(jié)的數(shù)值值。
BLOB 是一個二進制大對象,可以容納可變數(shù)量的數(shù)據(jù)。有 4 種 BLOB 類型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它們區(qū)別在于可容納存儲范圍不同。
TEXT 有 4 種文本類型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。對應(yīng)的這 4 種 BLOB 類型,可存儲的最大長度不同,可根據(jù)實際情況選擇。
-
char和varchar類型
- char是固定長度字符串,其長度范圍為0~255且與編碼方式無關(guān),無論字符實際長度是多少,都會按照指定長度存儲,不夠的用空格補足;
- varchar為可變長度字符串,在utf8編碼的數(shù)據(jù)庫中其長度范圍為0~21844;
- char實際占用的字節(jié)數(shù)即存儲的字符所占用的字節(jié)數(shù),varchar實際占用的字節(jié)數(shù)為存儲的字符+1或+2或+3;
- MySQL處理char類型數(shù)據(jù)時會將結(jié)尾的所有空格處理掉而varchar類型數(shù)據(jù)則不會;
- 如果char插入的字符串的長度已經(jīng)大于了可以插入的最大值,那么這個時候數(shù)據(jù)庫會報錯,而varchar會截取字符串。
-
varchar、text和blob
先說一下text,text和varchar是一組既有區(qū)別又有聯(lián)系的數(shù)據(jù)類型,其聯(lián)系在于當varchar(M)的M大于某些數(shù)值時,varchar會自動轉(zhuǎn)為text:
M>255時轉(zhuǎn)為tinytext
M>500時轉(zhuǎn)為text
M>20000時轉(zhuǎn)為mediumtext
所以過大的內(nèi)容varchar和text沒有區(qū)別,同事varchar(M)和text的區(qū)別在于:單行64K即65535字節(jié)的空間,varchar只能用63352/65533個字節(jié),但是text可以65535個字節(jié)全部用起來。
text可以指定text(M),但是M無論等于多少都沒有影響
text不允許有默認值,varchar允許有默認值
varchar和text兩種數(shù)據(jù)類型,使用建議是能用varchar就用varchar而不用text(存儲效率高),varchar(M)的M有長度限制,之前說過,如果大于限制,可以使用mediumtext(16M)或者longtext(4G)。至于text和blob,簡單過一下就是text存儲的是字符串而blob存儲的是二進制字符串,簡單說blob是用于存儲例如圖片、音視頻這種文件的二進制數(shù)據(jù)的。
-
ENUM類型(枚舉類型)
- ENUM('值1','值2',...,'值n')
n-代表參數(shù)列表中的第n個值,這些值末尾的空格會被系統(tǒng)直接刪除。
ENUM類型的值只能取列表中的一個元素。
取值列表中最多能有65535成員。
列表中的每一個值都有一個順序排列的編號,MySQL存入的是這個編號,而不是值。
- ENUM('值1','值2',...,'值n')
SET類型
在創(chuàng)建表時,SET類型的取值范圍就以列表的形式指定了。
SET('值1','值2',...,'值n')
SET類型的值最多只以是有64個元素構(gòu)成的組合。取值可以是其中的一個或多個。其它特性,與ENUM類似。