數據類型
- 數據長什么樣
- 數據需要多少空間來存放
- 系統內置數據類型
- 用戶定義數據類型
選擇正確的數據類型對于獲得高性能至關重要
三大原則:
- 更小的通常更好,盡量使用可正確存儲數據的最小數據類型
- 簡單就好,簡單數據類型的操作通常需要更少的CPU周期
- 盡量避免NULL,包含為NULL的列,對MySQL更難優化
1. 整數型
- 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后,則最大值翻倍
如:tinyint unsigned的取值范圍為(0~255)
int(m)里的m是表示SELECT查詢結果集中的顯示寬度,并不影響實際的取值范圍,規定了MySQL的一些交互工具(例如MySQL命令行客戶端)用來顯示字符的個數。對于存儲和計算來說,Int(1)和Int(20)是相同的
BOOL,BOOLEAN:布爾型,是TINYINT(1)的同義詞。
zero值被視為假,非zero值視為真
2. 浮點型(float和double)
浮點型為近似值,不精確,分為單精度和雙精度
float(m,d) 單精度浮點型 8位精度(4字節) m總個數,d小數位,
注意: 小數點不占用總個數
double(m,d) 雙精度浮點型 16位精度(8字節) m總個數,d小數位,
注意: 小數點不占用總個數
示例:
設一個字段定義為float(6,3),如果插入一個數123.45678,實際數據庫里存的是123.457,但總個數還以實際為準,即6位
3. 定點數
在數據庫中存放的是精確值,存為十進制
格式 decimal(m,d) 表示最多 m 位數字,其中 d個小數,小數點不算在長度內
比如: DECIMAL(6,2)總共能存6位數字,末尾2位是小數,字段最大值 9999.99(小數點不算在長度內)
參數m<65 是總個數,d<30目 d<m 是小數位
MySQL5.0和更高版本將數字打包保存到一個二進制字符串中(每4個字節存9個數字)。
例如: decimal(18,9)小數點兩邊將各存儲9個數字,一共使用9個字節:其中,小數點前的9個數字用4個字節,小數點后的9個數字用4個字節,小數點本身占1個字節
浮點類型在存儲同樣范圍的值時,通常比decimal使用更少的空間。foat使用4個字節存儲。double占用8個字節
因為需要額外的空間和計算開銷,所以應該盡量只在對小數進行精確計算時才使用decimal,例如存儲財務數據。但在數據量比較大的時候,可以考慮使用bigint代替decimal
4. 字符串(char,varchar,text)
- char(n) 固定長度,最多255個字符,注意不是字節
- varchar(n) 可變長度,最多65535個字符
- tinytext 可變長度,最多255個字符
- text 可變長度,最多65535個字符
- mediumtext 可變長度,最多2的24次方-1個字符
- longtext 可變長度,最多2的32次方-1個字符
- BINARY(M) 固定長度,可存二進制或字符,長度為0-M字節
- VARBINARY(M) 可變長度,可存二進制或字符,允許長度為0-M字節
- 內建類型:ENUM枚舉,SET集合
char和varchar的比較:
- char(n)若存入字符數小于n,則以空格補于其后,查詢之時再將空格去掉,所以char類型存儲的字符串末尾不能有空格,varchar不限于此
- char(n)固定長度,char(4)不管是存入幾個字符,都將占用4個字節,varchar是存入的實際字符數+1個字節(n < n > 255),所以varchar(4),存入3個字符將占用4個字節
- char類型的字符串檢索速度要比varchar類型的快
varchar 和text:
- varchar可指定n,text不能指定,內部存儲varchar是存入的實際字符數+1個字節(n < n > 255),text是實際字符數+2個字節。
- text類型不能有默認值
- varchar可直接創建索引,text創建索引要指定前多少個字符。varchar查詢速度快于text
5. 二進制數據BLOB
- BLOB和text存儲方式不同,TEXT以文本方式存儲,英文存儲區分大小寫,而Blob以二進制方式存儲不分大小寫
- BLOB存儲的數據只能整體讀出
- TEXT可以指定字符集,BLOB不用指定字符集
6. 日期時間類型
- date 日期 ‘2008-12-2’
- time 時間 ‘12:25:36’
- datetime 日期時間 ‘2008-12-2 22:06:44’
- timestamp 自動存儲記錄修改時間
- YEAR(2),YEAR(4):年份
- timestamp 此字段里的時間數據會隨其他字段修改的時候自動刷新,這個數據類型的字段可以存放這條記錄最后被修改的時間
7. 修飾符
適用所有類型的修飾符:
- NULL 數據列可包含NULL值,默認值
- NOT NULL 數據列不允許包含NULL值,相當于網站注冊表中的*為必填選項
- DEFAULT 默認值
- PRIMARY KEY 主鍵,所有記錄中此字段的值不能重復,且不能為NULL
- UNIQUE KEY 唯一鍵,所有記錄中此字段的值不能重復,但可以為NULL
- CHARACTER SET name 指定一個字符集
適用數值型的修飾符:
- AUTO_INCREMENT 自動遞增,適用于整數類型,必須作用于某個 key 的字段,比如primary key
- UNSIGNED 無符號