相信大家不管是看別人的代碼,還是自己的代碼總會在定義表的數據類型時,會需要在數據類型后面加一個括號,里面寫一個參數,例如int(3),smallint(5),char(5)等,但是括號里面的數字到底是什么意思呢?我以前也是只會用,但是感覺自己是在瞎用,根本沒有注意到重點,今天寫個博客記錄下重點。
首先我們先來講講字符和字節的概念。
字節(Byte)是一種計量單位,表示數據量多少,它是計算機信息技術用於計量存儲容量的一種計量單位。
字符是指計算機中使用的文字和符號,比如1、2、3、A、B、C、~!·#¥%……—*()——+、,中,國等等。
字符和字節不存在絕對的關系,只是在不同的編碼格式里,對應的比值不一樣。比如:
1.UTF-8編碼中,一個英文字符等於一個字節,一個中文(含繁體)字符等於三個字節。
2.Unicode編碼中,一個英文等於兩個字節,一個中文(含繁體)字符等於兩個字節。
符號:英文標點占一個字節,中文標點占兩個字節。舉例:英文句號“.”占1個字節的大小,中文句號“。”占2個字節的大小。
3.UTF-16編碼中,一個英文字母字符或一個漢字字符存儲都需要2個字節(Unicode擴展區的一些漢字存儲需要4個字節)。
4.UTF-32編碼中,世界上任何字符的存儲都需要4個字節。
所有你看見的單個字:a,啊,都叫字符。
char和varchar括號中的數字含義。
char的列長度是固定的,char的長度可選范圍在0-255字符之間。也就是char最大能存儲255個字符.
varchar的列長度是可變的,在mysql5.0.3之前varchar的長度范圍為0-255字符,mysql5.0.3之后varchar的長度范圍為0-65535個字節.
CHAR(M)定義的列的長度為固定的,M取值可以為0-255之間,當保存CHAR值時,在它們的右邊填充空格以達到指定的長度。當檢索到CHAR值時,尾部的空格被刪除掉。在存儲或檢索過程中不進行大小寫轉換。CHAR存儲定長數據很方便,CHAR字段上的索引效率級高,比如定義char(10),那么不論你存儲的數據是否達到了10個字符,都要占去10個字符的空間,不足的自動用空格填充。
VARCHAR(M)定義的列的長度為可變長字符串,VARCHAR的最大有效長度由最大行大小和使用的字符集確定。整體最大長度是65,532字節。VARCHAR值保存時不進行填充。當值保存和檢索時尾部的空格仍保留,符合標准SQL。varchar存儲變長數據,但存儲效率沒有CHAR高。如果一個字段可能的值是不固定長度的,我們只知道它不可能超過10個字符,把它定義為 VARCHAR(10)是最合算的。VARCHAR類型的實際長度是它的值的實際長度+1。為什么"+1"呢?這一個字節用於保存實際使用了多大的長度。從空間上考慮,用varchar合適;從效率上考慮,用char合適,關鍵是根據實際情況找到權衡點。
簡單來說:varchar(m)里面表示的是長度,例如:varchar(5)表示最大可存儲5個中文或5個英文字母。
int smallint等數據類型括號中的數字含義。
類型 |
大小 | 范圍(有符號) | 范圍(無符號) | 用途 |
TINYINT | 1字節 | (-128,127) | (0,255) | 小整數值 |
SMALLINT | 2字節 | (-32 768,32 767) | (0,65535) | 大整數值 |
MEDIUMINT | 3字節 | (-8 388 608,8 388 607) | (0,16 777 215) |
大整數值 |
INT | 4字節 | (-2 147 483 648,2 147 483 647) (0,4 294 967 295) |
(0,4 294 967 295) |
大整數值 |
BIGINT | 8字節 | (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) |
(0,18 446 744 073 709 551 615) |
極大整數值 |
這些類型,是定長的,其容量是不會隨着后面的數字而變化的,比如int(11)和int(8),都是一樣的占4字節。tinyint(1)和tinyint(10)也都占用一個字節。
那么后面的11和8,有啥用呢。
數據類型(m)中的m不是表示的數據長度,而是表示數據在顯示時顯示的最小長度。tinyint(1) 這里的1表示的是 最短顯示一個字符。tinyint(2) 這里的2表示的是 最短顯示兩個字符。
當字符長度(m)超過對應數據類型的最大表示范圍時,相當於啥都沒發生;
當字符長度(m)小於對應數據類型的表示范圍時,就需要指定拿某個字符來填充,比如zerofill(表示用0填充),
設置tinyint(2) zerofill 你插入1時他會顯示01;設置tinyint(4) zerofill 你插入1時他會顯示0001。
即使你建表時,不指定括號數字,mysql會自動分配長度:int(11)、tinyint(4)、smallint(6)、mediumint(9)、bigint(20)。
推薦兩篇博客: