表類型
MySQL的數(shù)據(jù)表類型很多,其中比較重要的是MyISAM,InnoDB這兩種。
這兩種類型各有優(yōu)缺點(diǎn),需要根據(jù)實(shí)際情況選擇適合的,MySQL支持對(duì)不同的表設(shè)置不同的類型。下面做個(gè)對(duì)比:
MyISAM表類型是一種比較成熟穩(wěn)定的表類型,但是MyISAM對(duì)一些功能不支持。
|
MyISAM |
InnoDB |
事務(wù) |
不支持 |
支持 |
數(shù)據(jù)行鎖定 |
不支持,只有表鎖定 |
支持 |
外鍵約束 |
不支持 |
支持 |
表空間大小 |
相對(duì)小 |
相對(duì)大,最大是2倍 |
全文索引 |
支持 |
不支持 |
GIS數(shù)據(jù) |
支持 |
不支持 |
COUNT問(wèn)題 |
無(wú) |
執(zhí)行COUNT(*)查詢時(shí),速度慢 |
一般情況下我覺(jué)得選擇MyISAM就行,如果需要事務(wù),或者需要很多用戶同時(shí)修改某個(gè)數(shù)據(jù)表里的數(shù)據(jù)時(shí),可以考慮InnoDB數(shù)據(jù)表。
數(shù)據(jù)類型
1.整型(xxxint)
MySQL數(shù)據(jù)類型 |
含義 |
tinyint(m) |
1個(gè)字節(jié)表示(-128~127) |
smallint(m) |
2個(gè)字節(jié)表示(-32768~32767) |
mediumint(m) |
3個(gè)字節(jié)表示(-8388608~8388607) |
int(m) |
4個(gè)字節(jié)表示(-2147483648~2147483647) |
bigint(m) |
8個(gè)字節(jié)表示(+-9.22*10的18次方) |
右側(cè)的取值范圍是在未加unsigned關(guān)鍵字的情況下,如果加了unsigned,則最大值翻倍,如tinyint
unsigned的取值范圍為(0~256)。
書(shū)上說(shuō)int(m)括弧里的m是表示SELECT查詢結(jié)果集中的顯示寬度,并不影響實(shí)際的取值范圍,我測(cè)了一下,定義一個(gè)字段number
類型為int(4),插入一條記錄"123456",用mysql query
broswer執(zhí)行SELECT查詢,返回的結(jié)果集中123456正確顯示,沒(méi)有影響到顯示的寬度,不知道這個(gè)m有什么用。
2.浮點(diǎn)型(float和double)
MySQL數(shù)據(jù)類型 |
含義 |
float(m,d) |
單精度浮點(diǎn)型,8位精度(4字節(jié)),m是十進(jìn)制數(shù)字的總個(gè)數(shù), d是小數(shù)點(diǎn)后面的數(shù)字個(gè)數(shù)。 |
double(m,d) |
雙精度浮點(diǎn)型,16位精度(8字節(jié)) |
參數(shù)m只影響顯示效果,不影響精度,d卻不同,會(huì)影響到精度。
比如設(shè)一個(gè)字段定義為float(5,3),如果插入一個(gè)數(shù)123.45678,實(shí)際數(shù)據(jù)庫(kù)里存的是123.457,小數(shù)點(diǎn)后面的數(shù)別四舍五入截成457了,但總個(gè)數(shù)不受到限制(6位,超過(guò)了定義的5位)。
3.定點(diǎn)數(shù)(decimal)
decimal(m,d)
定點(diǎn)類型
浮點(diǎn)型在數(shù)據(jù)庫(kù)中存放的是近似值,而定點(diǎn)類型在數(shù)據(jù)庫(kù)中存放的是精確值。參數(shù)m是定點(diǎn)類型數(shù)字的最大個(gè)數(shù)(精度),范圍為0~65,d小數(shù)點(diǎn)右側(cè)數(shù)字的個(gè)數(shù),范圍為0~30,但不得超過(guò)m。
對(duì)定點(diǎn)數(shù)的計(jì)算能精確到65位數(shù)字。
4.字符串(char,varchar,xxxtext)
MySQL數(shù)據(jù)類型 |
含義 |
char(n) |
固定長(zhǎng)度的字符串,最多255個(gè)字符 |
varchar(n) |
固定長(zhǎng)度的字符串,最多65535個(gè)字符 |
tinytext |
可變長(zhǎng)度字符串,最多255個(gè)字符 |
text |
可變長(zhǎng)度字符串,最多65535個(gè)字符 |
mediumtext |
可變長(zhǎng)度字符串,最多2的24次方-1個(gè)字符 |
longtext |
可變長(zhǎng)度字符串,最多2的32次方-1個(gè)字符 |
char和varchar:
1.都可以通過(guò)指定n,來(lái)限制存儲(chǔ)的最大字符數(shù)長(zhǎng)度,char(20)和varchar(20)將最多只能存儲(chǔ)20個(gè)字符,超過(guò)的字符將會(huì)被截掉。n必須小于該類型允許的最大字符數(shù)。
2.char類型指定了n之后,如果存入的字符數(shù)小于n,后面將會(huì)以空格補(bǔ)齊,查詢的時(shí)候再將末尾的空格去掉,所以char類型存儲(chǔ)的字符串末尾不能有空格,varchar不受此限制。
3.內(nèi)部存儲(chǔ)的機(jī)制不同。char是固定長(zhǎng)度,char(4)不管是存一個(gè)字符,2個(gè)字符或者4個(gè)字符(英文的),都將占用4個(gè)字節(jié),varchar是存入的實(shí)際字符數(shù)+1個(gè)字節(jié)(n<=255)或2個(gè)字節(jié)(n>255),所以varchar(4),存入一個(gè)字符將占用2個(gè)字節(jié),2個(gè)字符占用3個(gè)字節(jié),4個(gè)字符占用5個(gè)字節(jié)。
4.char類型的字符串檢索速度要比varchar類型的快。
varchar和text:
1.都是可變長(zhǎng)度的,最多能存儲(chǔ)65535個(gè)字符。
2.varchar可指定n,text不能指定,內(nèi)部存儲(chǔ)varchar是存入的實(shí)際字符數(shù)+1個(gè)字節(jié)(n<=255)或2個(gè)字節(jié)(n>255),text是實(shí)際字符數(shù)+2個(gè)字節(jié)。
3.text類型不能有默認(rèn)值。
5.二進(jìn)制數(shù)據(jù)(xxxBlob)
XXXBLOB和xxxtext是對(duì)應(yīng)的,不過(guò)存儲(chǔ)方式不同,xxxTEXT是以文本方式存儲(chǔ)的,如果存儲(chǔ)英文的話區(qū)分大小寫(xiě),而xxxBlob是以二進(jìn)制方式存儲(chǔ)的,不區(qū)分大小寫(xiě)。
xxxBlob存儲(chǔ)的數(shù)據(jù)只能整體讀出。
xxxTEXT可以指定字符集,xxxblob不用指定字符集。
6.日期時(shí)間類型(date,time,datetime,timestamp)
MySQL數(shù)據(jù)類型 |
含義 |
date |
日期'2008-12-2' |
time |
時(shí)間'12:25:36' |
datetime |
日期時(shí)間'2008-12-2 22:06:44' |
timestamp |
不固定 |
timestamp比較特殊,如果定義一個(gè)字段的類型為timestamp,這個(gè)字段的時(shí)間會(huì)在其他字段修改的時(shí)候自動(dòng)刷新。所以這個(gè)數(shù)據(jù)類型的字段可以存放這條記錄最后被修改的時(shí)間,而不是真正來(lái)的存放時(shí)間。
數(shù)據(jù)類型的屬性
MySQL關(guān)鍵字 |
含義 |
NULL |
數(shù)據(jù)列可包含NULL值 |
NOT
NULL |
數(shù)據(jù)列不允許包含NULL值 |
DEFAULT
xxx |
默認(rèn)值,如果插入記錄的時(shí)候沒(méi)有指定值,將取這個(gè)默認(rèn)值 |
PRIMARY
KEY |
主鍵 |
AUTO_INCREMENT |
遞增,如果插入記錄的時(shí)候沒(méi)有指定值,則在上一條記錄的值上加1,僅適用于整數(shù)類型 |
UNSIGNED |
無(wú)符號(hào) |
CHARACTER SET
name |
指定一個(gè)字符集 |