表類(lèi)型
MySQL的數(shù)據(jù)表類(lèi)型很多,其中比較重要的是MyISAM,InnoDB這兩種。
這兩種類(lèi)型各有優(yōu)缺點(diǎn),需要根據(jù)實(shí)際情況選擇適合的,MySQL支持對(duì)不同的表設(shè)置不同的類(lèi)型。下面做個(gè)對(duì)比:
MyISAM表類(lèi)型是一種比較成熟穩(wěn)定的表類(lèi)型,但是MyISAM對(duì)一些功能不支持。
| |
MyISAM |
InnoDB |
| 事務(wù) |
不支持 |
支持 |
| 數(shù)據(jù)行鎖定 |
不支持,只有表鎖定 |
支持 |
| 外鍵約束 |
不支持 |
支持 |
| 表空間大小 |
相對(duì)小 |
相對(duì)大,最大是2倍 |
| 全文索引 |
支持 |
不支持 |
| GIS數(shù)據(jù) |
支持 |
不支持 |
| COUNT問(wèn)題 |
無(wú) |
執(zhí)行COUNT(*)查詢(xún)時(shí),速度慢 |
一般情況下我覺(jué)得選擇MyISAM就行,如果需要事務(wù),或者需要很多用戶(hù)同時(shí)修改某個(gè)數(shù)據(jù)表里的數(shù)據(jù)時(shí),可以考慮InnoDB數(shù)據(jù)表。
數(shù)據(jù)類(lèi)型
1.整型(xxxint)
| MySQL數(shù)據(jù)類(lèi)型 |
含義 |
| 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查詢(xún)結(jié)果集中的顯示寬度,并不影響實(shí)際的取值范圍,我測(cè)了一下,定義一個(gè)字段number
類(lèi)型為int(4),插入一條記錄"123456",用mysql query
broswer執(zhí)行SELECT查詢(xún),返回的結(jié)果集中123456正確顯示,沒(méi)有影響到顯示的寬度,不知道這個(gè)m有什么用。
2.浮點(diǎn)型(float和double)
| MySQL數(shù)據(jù)類(lèi)型 |
含義 |
| 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)類(lèi)型
浮點(diǎn)型在數(shù)據(jù)庫(kù)中存放的是近似值,而定點(diǎn)類(lèi)型在數(shù)據(jù)庫(kù)中存放的是精確值。參數(shù)m是定點(diǎn)類(lèi)型數(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ù)類(lèi)型 |
含義 |
| 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必須小于該類(lèi)型允許的最大字符數(shù)。
2.char類(lèi)型指定了n之后,如果存入的字符數(shù)小于n,后面將會(huì)以空格補(bǔ)齊,查詢(xún)的時(shí)候再將末尾的空格去掉,所以char類(lèi)型存儲(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類(lèi)型的字符串檢索速度要比varchar類(lèi)型的快。
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類(lèi)型不能有默認(rèn)值。
5.二進(jìn)制數(shù)據(jù)(xxxBlob)
XXXBLOB和xxxtext是對(duì)應(yīng)的,不過(guò)存儲(chǔ)方式不同,xxxTEXT是以文本方式存儲(chǔ)的,如果存儲(chǔ)英文的話(huà)區(qū)分大小寫(xiě),而xxxBlob是以二進(jìn)制方式存儲(chǔ)的,不區(qū)分大小寫(xiě)。
xxxBlob存儲(chǔ)的數(shù)據(jù)只能整體讀出。
xxxTEXT可以指定字符集,xxxblob不用指定字符集。
6.日期時(shí)間類(lèi)型(date,time,datetime,timestamp)
| MySQL數(shù)據(jù)類(lèi)型 |
含義 |
| date |
日期'2008-12-2' |
| time |
時(shí)間'12:25:36' |
| datetime |
日期時(shí)間'2008-12-2 22:06:44' |
| timestamp |
不固定 |
timestamp比較特殊,如果定義一個(gè)字段的類(lèi)型為timestamp,這個(gè)字段的時(shí)間會(huì)在其他字段修改的時(shí)候自動(dòng)刷新。所以這個(gè)數(shù)據(jù)類(lèi)型的字段可以存放這條記錄最后被修改的時(shí)間,而不是真正來(lái)的存放時(shí)間。
數(shù)據(jù)類(lèi)型的屬性
| 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ù)類(lèi)型 |
| UNSIGNED |
無(wú)符號(hào) |
| CHARACTER SET
name |
指定一個(gè)字符集 |