表型別
mysql的資料表型別很多,其中比較重要的是myisam,innodb這兩種。
這兩種型別各有優缺點,需要根據實際情況選擇適合的,mysql支援對不同的表設定不同的型別。下面做個對比:
myisam表型別是一種比較成熟穩定的表型別,但是myisam對一些功能不支援。
myisam
innodb
事務不支援
支援資料行鎖定
不支援,只有表鎖定
支援外來鍵約束
不支援支援
表空間大小
相對小相對大,最大是2倍
全文索引
支援不支援
gis資料
支援不支援
count問題
無執行count(*)查詢時,速度慢
一般情況下我覺得選擇myisam就行,如果需要事務,或者需要很多使用者同時修改某個資料表裡的資料時,可以考慮innodb資料表。
資料型別
1.整型(***int)
mysql資料型別
含義tinyint(m)
1個位元組表示(-128~127)
smallint(m)
2個位元組表示(-32768~32767)
mediumint(m)
3個位元組表示(-8388608~8388607)
int(m)
4個位元組表示(-2147483648~2147483647)
bigint(m)
8個位元組表示(+-9.22*10的18次方)
右側的取值範圍是在未加unsigned關鍵字的情況下,如果加了unsigned,則最大值翻倍,如tinyint unsigned的取值範圍為(0~256)。
書上說int(m)括弧裡的m是表示select查詢結果集中的顯示寬度,並不影響實際的取值範圍,我測了一下,定義乙個欄位number 型別為int(4),插入一條記錄"123456",用mysql query broswer執行select查詢,返回的結果集中123456正確顯示,沒有影響到顯示的寬度,不知道這個m有什麼用。
2.浮點型(float和double)
mysql資料型別
含義float(m,d)
單精度浮點型,8位精度(4位元組),m是十進位制數字的總個數,
d是小數點後面的數字個數。
double(m,d)
雙精度浮點型,16位精度(8位元組)
引數m只影響顯示效果,不影響精度,d卻不同,會影響到精度。
比如設乙個字段定義為float(5,3),如果插入乙個數123.45678,實際資料庫裡存的是123.457,小數點後面的數別四捨五入截成457了,但總個數不受到限制(6位,超過了定義的5位)。
3.定點數(decimal)
decimal(m,d) 定點型別
浮點型在資料庫中存放的是近似值,而定點型別在資料庫中存放的是精確值。引數m是定點型別數字的最大個數(精度),範圍為0~65,d小數點右側數字的個數,範圍為0~30,但不得超過m。
對定點數的計算能精確到65位數字。
4.字串(char,varchar,***text)
mysql資料型別
含義char(n)
固定長度的字串,最多255個字元
varchar(n)
固定長度的字串,最多65535個字元
tinytext
可變長度字串,最多255個字元
text
可變長度字串,最多65535個字元
mediumtext
可變長度字串,最多2的24次方-1個字元
longtext
可變長度字串,最多2的32次方-1個字元
char和varchar:
1.都可以通過指定n,來限制儲存的最大字元數長度,char(20)和varchar(20)將最多只能儲存20個字元,超過的字元將會被截掉。n必須小於該型別允許的最大字元數。
2.char型別指定了n之後,如果存入的字元數小於n,後面將會以空格補齊,查詢的時候再將末尾的空格去掉,所以char型別儲存的字串末尾不能有空格,varchar不受此限制。
3.內部儲存的機制不同。char是固定長度,char(4)不管是存乙個字元,2個字元或者4個字元(英文的),都將占用4個位元組,varchar是存入的實際字元數+1個位元組(n<=255)或2個位元組(n>255),所以varchar(4),存入乙個字元將占用2個位元組,2個字元占用3個位元組,4個字元占用5個位元組。
4.char型別的字串檢索速度要比varchar型別的快。
varchar和text:
1.都是可變長度的,最多能儲存65535個字元。
2.varchar可指定n,text不能指定,內部儲存varchar是存入的實際字元數+1個位元組(n<=255)或2個位元組(n>255),text是實際字元數+2個位元組。
3.text型別不能有預設值。
4.varchar可直接建立索引,text建立索引要指定前多少個字元。查詢速度varchar要快於text,在都建立了索引的情況下,text的索引好像沒起作用,參見這篇文章:
5.二進位制資料(***blob)
***blob和***text是對應的,不過儲存方式不同,***text是以文字方式儲存的,如果儲存英文的話區分大小寫,而***blob是以二進位制方式儲存的,不區分大小寫。
***blob儲存的資料只能整體讀出。
***text可以指定字符集,***blob不用指定字符集。
6.日期時間型別(date,time,datetime,timestamp)
mysql資料型別
含義date
日期'2008-12-2'
time
時間'12:25:36'
datetime
日期時間'2008-12-2 22:06:44'
timestamp
不固定
timestamp比較特殊,如果定義乙個欄位的型別為timestamp,這個欄位的時間會在其他字段修改的時候自動重新整理。所以這個資料型別的字段可以存放這條記錄最後被修改的時間,而不是真正來的存放時間。
資料型別的屬性
mysql關鍵字
含義null
資料列可包含null值
not null
資料列不允許包含null值
default ***
預設值,如果插入記錄的時候沒有指定值,將取這個預設值
primary key
主鍵auto_increment
遞增,如果插入記錄的時候沒有指定值,則在上一條記錄的值上加1,僅適用於整數型別
unsigned
無符號character set name
指定乙個字符集
MySQL資料型別簡介
其中的長度以位元組為單位 名稱 長度 用法 tinyint m bit,bool,boolean 1 如果為無符號數,可以儲存從0到255的數 否則可以儲存從 128到127的數。smallint m 2 如果為無符號數,可以儲存從0到65535的數 否則可以儲存從 32768到32767的數。me...
MySQL資料型別簡介
近來把oracle資料庫換成mysql資料庫,oracle與mysql區別如下 1.nvl ifnull 2.oracle返回的list型別傳化為map時都為大寫的關鍵字儲存,mysql是看查詢語句是大寫還是小寫 3.mysql中connect by prior語句用不來 4.等繼 mysql資料型...
MySQL資料型別簡介
其中的長度以位元組為單位 名稱長度 用法tinyint m bit,bool,boolean 1 如果為無符號數,可以儲存從0到255的數 否則可以儲存從 128到127的數。smallint m 2 如果為無符號數,可以儲存從0到65535的數 否則可以儲存從 32768到32767的數。medi...