Mysql資料庫學習(二):資料型別(數值型別 日期和時間型別 字串型別)

s1mba發表於2014-02-18

資料型別

數值型別

日期和時間型別

字串型別



一、數值型別


整數


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 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
create table t_number(a tinyint, b tinyint unsigned);
insert into t_number values(100200);
insert into t_number values(-129200);
insert into t_number values(128200);
insert into t_number values(127200);
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.1234512345678.12345);
insert into t_number4 values(12345678.12345123456789123456789.12345); /* 12345700 | 1.2345678912345678e17  */
insert into t_number4 values(12345678.1234512345678912345.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 
1
2
3
4
5
6
7
8
9
10
11
12
13
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 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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 參考手冊


相關文章