MySQL基礎01-數據類型

一、整數類型

每個整型類型可以指定一個最小顯示寬度(注意:這個寬度並不表示存儲的值有多大)

類型 存儲空間(N) 取值範圍:-2(N-1)到 2(N-1)-1
TINYINT 8 -128……127
SMALLINT 16 -32768……32767
MEDIUMINT 24 -8388608……8388607
INT 32 -2147483648……2147483647
BIGINT 64 (自己算… …)

注:如果有指定UNSIGNED屬性,則存取範圍可以提升一倍,
即:-2N到 2N-1

基本格式:

INT[(M)] [UNSIGNED] [ZEROFILL]

① M:指定顯示寬度(默認是M=10),以實際的取值範圍爲準,值超過顯示寬度,顯示寬度自動增加
② unsigned:無符號的,表示只允許正數,所以取值範圍取絕對值且最大值*2
③ zerofill: 填充0(如果聲明瞭zerofill,該列會自動設爲unsigned)

二、實數類型

1、定點小數:decimal

基本格式:

DEC[(M[,D])] [UNSIGNED] [ZEROFILL]

① M:精度,(整數位數+小數位數)不包含小數點的數字總位數(1–30),不指定默認爲10
② D:小數位數,如果不指定,默認爲0

注: 若位數不夠,小數末尾補零;若位數超預算,則報錯。

2、浮點數:float與double

基本格式:

float[(length) | (<display width>,<scale>)]
double[(precision) | (<display width>,<scale>)]

兩者區別在於值所保留的存儲空間數量不同

注:由於對一個浮點數字來說,可用的存儲空間有限,如果一個數字非常大或非常小,將存儲這個數字的近似值而不是實際值。

使用方法:

① 使用一個參數來指定浮點類型
length/precision:在一個浮點數據類型中可以指定長度,來確定具體的浮點類型。
0~24:單精度float,從第7位有效位,進行四捨五入存儲
25~30:雙精度double,從第16位有效位,進行四捨五入存儲
如:

mysql> create table t3(id float(8));
//m=8,說明是單精度,存儲6位的近似值(第7位四捨五入,後面爲0)
mysql> insert into t3 values(123);
mysql> insert into t3 values(1234567);
mysql> insert into t3 values(123456789);
mysql> insert into t3 values(123456789.123456789);

mysql> select * from t3;
+-----------+
| id        |
+-----------+
| 123       |
| 1234570   |
| 123457000 |
| 123457000 |
+-----------+

② 使用兩個參數來指定浮點類型
單精度float(m,d):m表示精度(0~24),d表示小數位數
雙精度double(m,d):m表示精度(25~30),d表示小數位數
注意:整數位(m-d)不夠沒關係,超出報錯;小數位(d)不夠補零,超出四捨五入。

三、字符串

類型 描述
char(n) 固定長度,最多255個字符。char非常適合用於存儲密碼的MD5值
varchar(n) 可變長度,最多65535個字符。varchar需要使用1或2個額外字節記錄字符串長度:如果列的最大長度小於或等於255字節,則使用1個字節表示,否則使用2個字節。
TEXT 包括TINYTEXT、SMALLTEXT(TEXT)、MEDIUMTEXT、LONGTEXT
BLOB 包括TINYBLOB、SMALLBLOB(BLOB)、MEDIUMBLOB、LONGBLOB,二進制類型。BLOB 可以儲存圖片。

1、char和varchar
區別:
① char(n) 若存入字符數小於n,則以空格補於其後,查詢之時再將空格去掉。所以char類型存儲的字符串末尾不能有空格,varchar不限於此。
② char(n) 固定長度,char(4)不管是存入幾個字符,都將佔用4個字節,varchar是存入的實際字符數+1個字節(n<=255)或2個字節(n>255),所以varchar(4),存入3個字符將佔用4個字節。
③ char類型的字符串檢索速度要比varchar類型的快。
④ 對於經常更變的數據,char比varchar更好,char不容易產生碎片。
相同:
① 如果存儲內容走出指定長度,都會被截斷。

2、varchar和text的區別:
① varchar可指定n,text不能指定,內部存儲varchar是存入的實際字符數+1個字節(n<=255)或2個字節(n>255),text是實際字符數+2個字節。
② text類型不能有默認值。
③ varchar可直接創建索引,text創建索引要指定前多少個字符。varchar查詢速度快於text,在都創建索引的情況下,text的索引似乎不起作用。
④ char和varchar可以有默認值,text不能指定默認值。

注:儘量避免使用BLOB/TEXT類型,查詢會使用臨時表,導致嚴重的性能開銷。

四、枚舉

枚舉可以把一些不重複的字符串存儲成一個預定的集合。MySQL在存儲枚舉時非常緊湊,會根據列表值的數量壓縮到一個或者兩個字節中。MySQL在內部會將每個值在列表中的位置保存爲整數,並且在表的*.frm*文件中保存“數字 - 字符串”映射關係的“查找表”。

注:儘量避免使用數據作爲ENUM枚舉的常量,易混亂。

五、時間和日期

類型 描述
DATETIME 表示時間範圍是1001年到9999年,精度爲秒。佔用8個字節。
TIMESTAMP 佔用4個字節,表示時間範圍從1970年到2038年。使用該類型時一定要注意時區問題。

六、位

位主要是用來存放二進制數,select查詢默認顯示10進制,可以使用bin()、hex()函數來進行查詢。

bin()—顯示二進制格式
hex()—顯示十六進制格式

如:

mysql> create table t(id bit(4));

mysql> insert into t values(2);
mysql> insert into t values(13);

mysql> select bin(id),hex(id) from t;
+---------+---------+
| bin(id) | hex(id) |
+---------+---------+
| 10      | 2       |
| 1101    | D       |
+---------+---------+ 

參考

《高性能MySQL》 [美]Baron Scbwartz, Peter Zaitsev, Vadim Tkacbenko 著

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章