這裏先總結數據類型。MySQL中的數據類型大的方面來分,能夠分爲:日期和時間、數值,以及字符串。下面就分開來進行總結。數據庫
日期和時間數據類型數組
MySQL數據類型 | 含義 |
date | 3字節,日期,格式:2014-09-18 |
time | 3字節,時間,格式:08:42:30 |
datetime | 8字節,日期時間,格式:2014-09-18 08:42:30 |
timestamp | 4字節,自動存儲記錄修改的時間 |
year | 1字節,年份 |
數值數據類型函數
整型性能
MySQL數據類型 | 含義(有符號) |
tinyint | 1字節,範圍(-128~127) |
smallint | 2字節,範圍(-32768~32767) |
mediumint | 3字節,範圍(-8388608~8388607) |
int | 4字節,範圍(-2147483648~2147483647) |
bigint | 8字節,範圍(+-9.22*10的18次方) |
上面定義的都是有符號的,固然了,也能夠加上unsigned關鍵字,定義成無符號的類型,那麼對應的取值範圍就要翻翻了,好比:spa
tinyint unsigned的取值範圍爲0~255。排序
浮點型索引
MySQL數據類型 | 含義 |
float(m, d) | 4字節,單精度浮點型,m總個數,d小數位 |
double(m, d) | 8字節,雙精度浮點型,m總個數,d小數位 |
decimal(m, d) | decimal是存儲爲字符串的浮點數 |
我在MySQL中創建了一個表,有一列爲float(5, 3);作了如下試驗:ci
1.插入123.45678,最後查詢獲得的結果爲99.999;rem
2.插入123.456,最後查詢結果爲99.999;字符串
3.插入12.34567,最後查詢結果爲12.346;
因此,在使用浮點型的時候,仍是要注意陷阱的,要以插入數據庫中的實際結果爲準。
字符串數據類型
MySQL數據類型 | 含義 |
char(n) | 固定長度,最多255個字符 |
varchar(n) | 可變長度,最多65535個字符 |
tinytext | 可變長度,最多255個字符 |
text | 可變長度,最多65535個字符 |
mediumtext | 可變長度,最多2的24次方-1個字符 |
longtext | 可變長度,最多2的32次方-1個字符 |
1.char(n)和varchar(n)中括號中n表明字符的個數,並不表明字節個數,因此當使用了中文的時候(UTF8)意味着能夠插入m箇中文,可是實際會佔用m*3個字節。
2.同時char和varchar最大的區別就在於char無論實際value都會佔用n個字符的空間,而varchar只會佔用實際字符應該佔用的空間+1,而且實際空間+1<=n。
3.超過char和varchar的n設置後,字符串會被截斷。
4.char的上限爲255字節,varchar的上限65535字節,text的上限爲65535。
5.char在存儲的時候會截斷尾部的空格,varchar和text不會。
6.varchar會使用1-3個字節來存儲長度,text不會。
其它類型
1.enum(「member1″, 「member2″, … 「member65535″)
enum數據類型就是定義了一種枚舉,最多包含65535個不一樣的成員。當定義了一個enum的列時,該列的值限制爲列定義中聲明的值。若是列聲明包含NULL屬性,則NULL將被認爲是一個有效值,而且是默認值。若是聲明瞭NOT NULL,則列表的第一個成員是默認值。
2.set(「member」, 「member2″, … 「member64″)
set數據類型爲指定一組預約義值中的零個或多個值提供了一種方法,這組值最多包括64個成員。值的選擇限制爲列定義中聲明的值。
數據類型屬性
上面大概總結了MySQL中的數據類型,固然了,上面的總結確定是不全面的,若是要很是全面的總結這些內容,好幾篇文章都不夠的。下面就再來總結一些經常使用的屬性。
1.auto_increment
auto_increment能爲新插入的行賦一個惟一的整數標識符。爲列賦此屬性將爲每一個新插入的行賦值爲上一次插入的ID+1。
MySQL要求將auto_increment屬性用於做爲主鍵的列。此外,每一個表只容許有一個auto_increment列。例如:
代碼以下:
id smallint not null auto_increment primary key
2.binary
binary屬性只用於char和varchar值。當爲列指定了該屬性時,將以區分大小寫的方式排序。與之相反,忽略binary屬性時,將使用不區分大小寫的方式排序。例如:
代碼以下:
hostname char(25) binary not null
3.default
default屬性確保在沒有任何值可用的狀況下,賦予某個常量值,這個值必須是常量,由於MySQL不容許插入函數或表達式值。此外,此屬性沒法用於BLOB或TEXT列。若是已經爲此列指定了NULL屬性,沒有指定默認值時默認值將爲NULL,不然默認值將依賴於字段的數據類型。例如:
代碼以下:
subscribed enum('0', '1') not null default '0'
4.index
若是全部其餘因素都相同,要加速數據庫查詢,使用索引一般是最重要的一個步驟。索引一個列會爲該列建立一個有序的鍵數組,每一個鍵指向其相應的錶行。之後針對輸入條件能夠搜索這個有序的鍵數組,與搜索整個未索引的表相比,這將在性能方面獲得極大的提高。
代碼以下:
create table employees
(
id varchar(9) not null,
firstname varchar(15) not null,
lastname varchar(25) not null,
email varchar(45) not null,
phone varchar(10) not null,
index lastname(lastname),
primary key(id)
);
咱們也能夠利用MySQL的create index命令在建立表以後增長索引:
代碼以下:
create index lastname on employees (lastname(7));
這一次只索引了名字的前7個字符,由於可能不須要其它字母來區分不一樣的名字。由於使用較小的索引時性能更好,因此應當在實踐中儘可能使用小的索引。
5.not null
若是將一個列定義爲not null,將不容許向該列插入null值。建議在重要狀況下始終使用not null屬性,由於它提供了一個基本驗證,確保已經向查詢傳遞了全部必要的值。
6.null
爲列指定null屬性時,該列能夠保持爲空,而不論行中其它列是否已經被填充。記住,null精確的說法是「無」,而不是空字符串或0。
7.primary key
primary key屬性用於確保指定行的惟一性。指定爲主鍵的列中,值不能重複,也不能爲空。爲指定爲主鍵的列賦予auto_increment屬性是很常見的,由於此列沒必要與行數據有任何關係,而只是做爲一個惟一標識符。主鍵又分爲如下兩種:
(1)單字段主鍵
若是輸入到數據庫中的每行都已經有不可修改的惟一標識符,通常會使用單字段主鍵。注意,此主鍵一旦設置就不能再修改。
(2)多字段主鍵
若是記錄中任何一個字段都不可能保證惟一性,就可使用多字段主鍵。這時,多個字段聯合起來確保惟一性。若是出現這種狀況,指定一個auto_increment整數做爲主鍵是更好的辦法。
8.unique
被賦予unique屬性的列將確保全部值都有不一樣的值,只是null值能夠重複。通常會指定一個列爲unique,以確保該列的全部值都不一樣。例如:
代碼以下:
email varchar(45) unique
9.zerofill
zerofill屬性可用於任何數值類型,用0填充全部剩餘字段空間。例如,無符號int的默認寬度是10;所以,當「零填充」的int值爲4時,將表示它爲0000000004。例如:
代碼以下:
orderid int unsigned zerofill not null