一、數值類型
整數
tinyint[M] [unsigned] [zerofill] // [ ] 表示可選,這里的M表示顯示寬度,并不是取值范圍,顯示寬度不夠前面以0填充
bool是tinyint(1)的別名
浮點型
IEEE 754浮點數表示
S:符號位
E:指數位
M:尾數位,也叫有效數字位
N =(-1)^S * M * 2^E
單精度float 4個字節 ,取值范圍-3.402823466E+38~3.402823466E+38, 精度大約7位
雙精度double 8個字節,取值范圍 -1.7976931348623157E+308~1.7976931348623157E+308, 精度大約15位
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL] // M總位數,D是小數點后面的位數,這里是取值范圍
real是double的別名
定點型
DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL] //M缺省是10,D缺省是0
decimal取值范圍與double是一樣的,但是有更高的精度。
decimal存儲方式,參考:http://dev.mysql.com/doc/refman/5.1/zh/precision-math.html
numeric是decimal的別名
SQL Code create table t_number(a tinyint, b tinyint unsigned); insert into t_number values(100, 200); insert into t_number values(-129, 200); insert into t_number values(128, 200); insert into t_number values(127, 200); insert into t_number values(127, -1); create table t_number2(a int(4) zerofill); insert into t_number2 values(123); insert into t_number2 values(123456); create table t_number3(a bool); create table t_number4(a float, b double); insert into t_number4 values(12345678.12345, 12345678.12345); insert into t_number4 values(12345678.12345, 123456789123456789.12345); /* 12345700 | 1.2345678912345678e17 */ insert into t_number4 values(12345678.12345, 12345678912345.12345); create table t_number5(a double(5,2)); /* -999.99 ~999.99 */ create table t_number6(a decimal(30,6)); insert into t_number6 values(123456789123456789.12345); create table t_number7(a decimal(5,2)); /* -999.99 ~999.99*/
二、字符串類型
char(M)
varchar(M) //這里的M表示字符數
CHAR列的長度固定為創建表時聲明的長度。長度可以為從0到255的任何值。當保存CHAR值時,在它們的右邊填充空格以達到指定的長度。當檢索到CHAR值時,尾部的空格被刪除掉。在存儲或檢索過程中不進行大小寫轉換。
VARCHAR列中的值為可變長字符串。長度可以指定為0到65,535之間的值。VARCHAR的最大有效長度由最大行大小和使用的字符集確定。舉例來說,如果字符集為uft8,那么一個字符需要3個字節來存儲,則可以保存的字符數為65535/3=21845,此外還需要一個字符的位置來存儲字符個數,故最大可填寫的字符數為21844。若是latin1,一個字符只需1個字節存儲,那么可填寫的字符數為65532。
binary/varbinary
BINARY和VARBINARY類類似于CHAR和VARCHAR,不同的是它們包含二進制字符串。也就是說,它們包含字節字符串而不是字符字符串。這說明它們沒有字符集,并且排序和比較基于列值字節的數值值。
字符串存儲需求
VARCHAR、BLOB和TEXT類是變長類型。每個類型的存儲需求取決于列值的實際長度(用前面的表中的L表示),而不是該類型的最大可能的大小。例如,VARCHAR(10)列可以容納最大長度為10的字符串。實際存儲需求是字符串(L)的長度,加上一個記錄字符串長度的字節。對于字符串'abcd',L是4,存儲需要5個字節。
對于CHAR、VARCHAR和TEXT類型,前面的表中的值L和M應解釋為字符數目,并且列定義中的這些類型的長度表示字符數目。例如,要想保存一個TINYTEXT值需要L字符+ 1個字節。
enum/set SQL Code create table t_enum(sex enum('male', 'female')); /* 1 2 */ insert into t_enum values('male'); insert into t_enum values('female'); insert into t_enum values(1); select sex+0 from t_enum;create table t_set(favourite set('dog', 'cat', 'bird')); /* 1 10 100 */ insert into t_set values('dog,cat'); insert into t_set values('dog,bird'); select favourite+0 from t_set;
枚舉/集合看過去像是字符串,實際上保存的是整數。
三、日期和時間
日期和時間看起來像字符串,但是以整數來保存的。
SQL Code create table t_datetime(a datetime); insert into t_datetime values('2014-01-15 10:10:10'); insert into t_datetime values('9999-12-31 23:59:59'); insert into t_datetime values('10000-01-01 00:00:00'); insert into t_datetime values('999-01-01 00:00:00'); insert into t_datetime values('99-01-01 00:00:00'); insert into t_datetime values('69-01-01 00:00:00'); create table t_timestamp(a timestamp); insert into t_timestamp values('2014-01-15 10:10:10'); insert into t_timestamp values('2038-01-19 03:14:07'); insert into t_timestamp values('2038-01-19 03:14:08'); insert into t_timestamp values('2038-01-19 11:14:07'); insert into t_timestamp values('2038-01-19 11:14:08'); create table t_date(a date); insert into t_date values('2012-01-01'); create table t_time(a time); /* 可以表示時間差 */ insert into t_time values('23:12:12'); insert into t_time values('823:12:12'); insert into t_time values('3 23:12:12'); /* 3表示3小時 */ create table t_year(a year); insert into t_year values (2000); insert into t_year values ('2155'); insert into t_year values (2156);
參考:
《數據庫系統概論》
mysql 5.1 參考手冊
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com