建表: 其實就是聲明列的過程,數據最終是以文件的形式放在硬盤(內存)
列: 不同的列類型占的空間不一樣. 選列的原則: 夠用,不浪費
列類型有: 整形、浮點型、字符型、日期/時間型
tinyint/smallint/mediumint/int/bigint
2.1.1、詳解tinyint 一個字節
[][][][][][][][]共8位
假設8為都為0 ==》 轉化為十進制 0
假設8為都為1 ==》 轉換為十進制 2^8-1
由於計算機也能夠存儲負數,並采用最高位為符號位
最高位為0代表正數 最高位為1代表負數
當最高位為0時:
[0][][][][][][][] => 0~2^7-1 轉化為十進制 0~127
當最高位為1時
[1][][][][][][][] => 0~-2^7 轉化為十進制 0~-128
列
字節
無符號
有符號
tinyint
1
0~255
-128~127
smallint
2
0~2^16-1
-2^15~2^15
medium
3
0~2^24-1
-2^23~2^23
int
4
0~2^32-1
-2^31~2^31
bigint
8
0~2^64-1
-2^63~2^63
2.1.2、實例
2.1.3、整形列可選屬性: not null unsigned zerofill
總結:
a、聲明整數型列需要0填充時,它一定是無符號的
b、進行0填充時,不會改變其大小值
對於浮點列類型,在MySQL中單精度值使用4個字節,雙精度值使用8個字節。
float與decimal的區別:decimal更精確
char:定長char(M),M代表寬度,即可容納的字符數
varchar:變長char(M),M代表寬度,即可容納的字符數
區別:
a、效率方面看,char<=1 varchar<1
即char會有完全利用的情況,而varchar則不會。因為同CHAR對比,VARCHAR值保存時只保存需要的字符數,另加一個字節來記錄長度
b、針對尾部(從左往右的方向看),char會過濾尾部有空格的情況,而varchar不會。因為char存儲的字符少於定義的字符長度時,就會對尾部進行空格填充.進行展示時,再把尾部的空格去掉
案例:
CREATETABLE vc (v VARCHAR(4), c CHAR(4));
INSERTINTO vc VALUES ('ab ', 'ab ');
SELECTCONCAT(v, '+'), CONCAT(c, '+') FROM vc;
字節問題:
varchar(N), 這裡的N是指字符數,並不是字節數.占用的字節數與編碼有關
utf-8,一個漢字3字節 英文字母1字節
MySQL 5.0以上的版本:
1.一個漢字占多少長度與編碼有關:
UTF-8:一個漢字=3個字節
GBK:一個漢字=2個字節
2.varchar(n)表示n個字符,無論漢字和英文,Mysql都能存入n個字符,僅是實際字節長度有所區別
3.MySQL檢查長度,可用SQL語言:
select LENGTH(fieldname) from tablename來查看
2.4、日期與時間型
2.4.1、 year
總結
MySQL以YYYY格式檢索和顯示YEAR值。范圍是1901到2155。
可以指定各種格式的YEAR值:
· 四位字符串,范圍為'1901'到'2155'。
· 四位數字,范圍為1901到2155。
· 兩位字符串,范圍為'00'到'99'。'00'到'69'和'70'到'99'范圍的值被轉換為2000到2069和1970到1999范圍的YEAR值。
· 兩位整數,范圍為1到99。1到69和70到99范圍的值被轉換為2001到2069和1970到1999范圍的YEAR值。請注意兩位整數范圍與兩位字符串范圍稍有不同,因為你不能直接將零指定為數字並將它解釋為2000。你必須將它指定為一個字符串'0'或'00'或它被解釋為0000。
2.4.2、 time
MySQL以'HH:MM:SS'格式檢索和顯示TIME值(或對於大的小時值采用'HHH:MM:SS'格式)。TIME值的范圍可以從'-838:59:59'到'838:59:59'。小時部分會因此大的原因是TIME類型不僅可以用於表示一天的時間(必須小於24小時),還可能為某個事件過去的時間或兩個事件之間的時間間隔(可以大於24小時,或者甚至為負)。
2.4.3、 date
當你只需要日期值而不需要時間部分時應使用DATE類型。MySQL用'YYYY-MM-DD'格式檢索和顯示DATE值。支持的范圍是'1000-01-01'到 '9999-12-31'。
2.4.4、 datetime
總結:雖然mysql有時間與日期的類型。但在一般的開發過程中涉及到跟時間方面的列類型時,通常使用int即整形類型。主要考慮到開發方面的方便,而且整形效率高。