整型數據
以TINYINT為例(其他整型數據類似):
創建字段類型為TINYINT(1)
,則該字段可以取到的有符號整型最小值:-128
,最大值:127
。-129和128都是越界值,插入時會報錯。
創建TINYINT(2)
的字段,進行測試同樣取最小值:-128,最大值:127。由於TINYINT默認只占用1個字節,所以即使聲明為2個字節大小,也只能存儲一個字節的值。
PS:一個字節(bytes) = 八位(bits)。八位可以表示無符號整數:2^8 - 1 = 256 - 1 = 255,即表示 0-255 范圍的數字大小。
浮點和定點數據類型
浮點數分為兩種:單精度浮點類型(FLOAT)和雙精度浮點類型(DOUBLE)。
定點數類型為:DECIMAL
浮點數類型和定點數類型都可以用(M,N)來表示。其中,M稱為精度
,表示總共的位數;N稱為標度
,表示小數的位數。
以FLOAT(5,3)
為例:其值在數據庫中為55.0001,則在查詢時因為M精度的設置,只能顯示5位數字,因此該值會被四舍五入
為:55.000,同理若為55.0006,則會四舍五入為55.001。
此外:FLOAT和DOUBLE存儲的是近似值,而DECIMAL存儲的是字符串,所以會不對數值進行四舍五入,因此精確度更高(例如:DECIMAL(5,3),其值設置為55.0001和55.0009都會顯示55.000)。
在定義商品價格之類的類型時,使用FLOAT足以。
日期與時間類型
……
字符串類型
CHAR(M)
和VARCHAR(M)
表示在創建表時指定的存儲字符串的最大長度為M。
CHAR類型
是固定長度的。取值范圍為:0-255之間的任意值,設置成功后長度不變(即占用存儲空間大小被固定)
VARCHAR類型
是變長的。取值范圍為:0-65535之間的任意值,設置最大值之后,其存儲空間根據字符串長度進行變化。例如:VARCHAR(10),但是只占用了5個字節的大小,因此該字段的空間只占用5+1個字節,最后一個字節位結束標識符。
對CHAR和VARCHAR的取值范圍進行測試,定義CHAR(5)和 VARCHAR(5)只能存儲一個字節大小的數據。
CHAR(5) | 占用字節 | VARCHAR(5) | 占用字節 |
---|---|---|---|
""(空字符串) | 5 | ""(空字符串) | 1 |
"ab1" | 5 | "數字1" | 4 |
"12345" | 5 | "12345" | 6 |
"插入六個漢字" | 越界禁止插入 | "插入1234" | 越界禁止插入 |
TEXT類型
TEXT類型是一種特殊的字符串類型,其中漢字占用3字節,數字字母占用1字節。包括:TINYTEXT,TEXT,MEDIUMTEXT,LONGTEXT
類型 | 允許的長度 | 存儲空間 |
---|---|---|
TINYTEXT | 0-255字節 | 值的長度+2個字節 |
TEXT | 0-65535字節 | 值的長度+2個字節 |
MEDIUMTEXT | 0-16772150字節 | 值的長度+3個字節 |
LONGTEXT | 0-4294967295字節(2^32-1 = 4G) | 值的長度+4個字節 |
PS:UTF-8對字符串編碼,一個漢字占用3個字節,一個字母和數字占用1個字節(mysql配置啟用UTF-8編碼)
TINYTEXT默認取值255不可更改大小,因此TINTEXT可以存儲255個英文字母,85個漢字。
其余類型可以取固定存儲長度。
ENUM類型
ENUM是一個字符串對象,其值為表創建時在列規定中枚舉的一列值。語法格式如下:
字段名 ENUM ('值1’,'值2',…… '值n')
其中,“字段名”指將要定義的字段,“值n”指枚舉列表中的第n個值。ENUM類型的字段在取值時,只能在指定的枚舉列表中取,而且一次只能取一個。創建的成員中有空格時,其尾部的空格將自動被刪除。ENUM值在內部用整數表示,並且每個枚舉值均有一個索引值:列表值所允許的成員值從1開始編號,MySQL存儲的就是這個索引編號。枚舉最多可以有65535個元素。
例如,定義ENUM類型的列(' first','second','third')該列可以取的值和每個值的索引如表5.7所示。
SET類型
SET是一個字符串對象,可以有零或多個值。SET列最多可以有64個成員,其值為表創建時規定的一列值。指定包括多個SET成員的SET列值時,各成員之間用逗號()間隔開。語法格式如
SET ('值1','值2',……,'值n')
與ENUM類型相同,SET值在內部用整數表示,列表中每一個值都有一個索引編號。當創建表時,SET成員值的尾部空格將自動被刪除。
二進制數據類型
BIT類型
BIT類型是位字段類型。M表示每個值的位數,范圍為1~64。如果M被省略,默認為1。如果為BIT(M)列分配的值的長度小於M位,就在值的左邊用0填充。例如,為BIT(6列分配一個值b'l01’,其效果與分配b'000101相同。BIT數據類型用來保存位字段值。例如,以二進制的形式保存數據13(13的二進制形式為1101),在這里需要位數至少為4位的BIT類型,即可以定義列類型為BIT(4),大於二進制1111的數據是不能插入BIT(4)類型的字段中的。
BINARY和 VARBINARY類型類
BINARY和 VARBINARY類型類似於CHAR和 VARCHAR,不同的是它們包含二進制字節字符串。其使用的語法格式如下:列名稱 BINARY(M)或者 VARBINARY(M)
BINARY類型的長度是固定的,指定長度之后,不足最大長度的,將在它們右邊填充“0’補齊以達到指定長度。例如:指定列數據類型為 BINARY(3),當插入a’時,存儲的內容實際為“a00”,當插入“ab”時,實際存儲的內容為“ab0”,不管存儲的內容是否達到指定的長度,其存儲空間均為指定的值M VARBINARY類型的長度是可變的,指定好長度之后,其長度可以在0到最大值之間。例如:指定列數據類型為 VARBINARY(20),如果插入的值的長度只有10,則實際存儲空間為10加1,即實際占用的空間為字符串的實際長度加1。
BLOB類型
BLOB列存儲的是二進制字符串(字節字符串),TEXT列存儲的是非二進制字符串(字符字符串)。BLOB列沒有字符集,並且排序和比較基於列值字節的數值;TEXT列有一個字符集,並且根據字符集對值進行排序和比較。
BLOB列存儲的是二進制字符串(字節字符串),TEXT列存儲的是非二進制字符串(字符字符串)。BLOB列沒有字符集,並且排序和比較基於列值字節的數值;TEXT列有一個字符集,並且根據字符集對值進行排序和比較。
與ENUM類型不同的是,ENUM類型的字段只能從定義的列值中選擇一個值插入,而SET類型的列可從定義的列值中選擇多個字符的聯合。
如果插入SET字段中列值有重復,則 MySQL自動刪除重復的值;插入SET字段的值的順序並不重要,MySQL會在存入數據庫時按照定義的順序顯示;如果插入了不正確的值,默認情況下,MySQL將忽視這些值,並給出警告