主要討論以下主題:
· CHAR 和 VARCHAR介紹以及工作?
· CHAR 和 VARCHAR 區別
· CHAR(4) 和 VARCAHR(4)區別
· 了解TEXT 和 BLOB
· 了解ENUM
字符串類型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。該節描述了這些類型如何工作以及如何在查詢中使用這些類型。
1. String類型
1.1. CHAR和VARCHAR類型
CHAR tʃɑː VARCHAR vɑ:(r)
CHAR和VARCHAR類型類似,但它們保存和檢索的方式不同。它們的最大長度和是否尾部空格被保留等方面也不同。在存儲或檢索過程中不進行大小寫轉換。
CHAR和VARCHAR類型聲明的長度表示你想要保存的最大字符數。例如,CHAR(30)可以占用30個字符。
CHAR列的長度固定為創建表時聲明的長度。長度可以為從0到255的任何值。當保存CHAR值時,在它們的右邊填充空格以達到指定的長度。當檢索到CHAR值時,尾部的空格被刪除掉。在存儲或檢索過程中不進行大小寫轉換。
VARCHAR列中的值為可變長字符串。長度可以指定為0到65,535之間的值。(VARCHAR的最大有效長度由最大行大小和使用的字符集確定。整體最大長度是65,532字節)。
同CHAR對比,VARCHAR值保存時只保存需要的字符數,另加一個字節來記錄長度(如果列聲明的長度超過255,則使用兩個字節)。
VARCHAR值保存時不進行填充。當值保存和檢索時尾部的空格仍保留,符合標准SQL。
下面的表顯示了將各種字符串值保存到CHAR(4)和VARCHAR(4)列后的結果,說明了CHAR和VARCHAR之間的差別:
值 |
CHAR(4) |
存儲需求 |
VARCHAR(4) |
存儲需求 |
'' |
' ' |
4個字節 |
'' |
1個字節 |
'ab' |
'ab ' |
4個字節 |
'ab ' |
3個字節 |
'abcd' |
'abcd' |
4個字節 |
'abcd' |
5個字節 |
'abcdefgh' |
'abcd' |
4個字節 |
'abcd' |
5個字節 |
請注意上表中最后一行的值只適用不使用嚴格模式時;如果MySQL運行在嚴格模式,超過列長度不的值不保存,並且會出現錯誤。
從CHAR(4)和VARCHAR(4)列檢索的值並不總是相同,因為檢索時從CHAR列刪除了尾部的空格。具體例子可以參考mysql手冊。
BLOB是一個二進制大對象,可以容納可變數量的數據。有4種BLOB類型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它們只是可容納值的最大長度不同。
有4種TEXT類型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。這些對應4種BLOB類型,有相同的最大長度和存儲需求。
BLOB 列被視為二進制字符串(字節字符串)。TEXT列被視為非二進制字符串(字符字符串)。BLOB列沒有字符集,並且排序和比較基於列值字節的數值值。TEXT列有一個字符集,並且根據字符集的 校對規則對值進行排序和比較。
在TEXT或BLOB列的存儲或檢索過程中,不存在大小寫轉換。
在大多數方面,可以將BLOB列視為能夠足夠大的VARBINARY列。同樣,可以將TEXT列視為VARCHAR列。BLOB和TEXT在以下幾個方面不同於VARBINARY和VARCHAR:
· 當保存或檢索BLOB和TEXT列的值時不刪除尾部空格。(這與VARBINARY和VARCHAR列相同)。
請注意比較時將用空格對TEXT進行擴充以適合比較的對象,正如CHAR和VARCHAR。
· 對於BLOB和TEXT列的索引,必須指定索引前綴的長度。對於CHAR和VARCHAR,前綴長度是可選的。
· BLOB和TEXT列不能有 默認值。
ENUM是一個字符串對象,其值來自表創建時在列規定中顯式枚舉的一列值。
在某些情況下,ENUM值也可以為空字符串('')或NULL:
· 如果你將一個非法值插入ENUM(也就是說,允許的值列之外的字符串),將插入空字符串以作為特殊錯誤值。該字符串與“普通”空字符串不同,該字符串有數值值0。后面有詳細討論。
· 如果將ENUM列聲明為允許NULL,NULL值則為該列的一個有效值,並且 默認值為NULL。如果ENUM列被聲明為NOT NULL,其默認值為允許的值列的第1個元素。
每個枚舉值有一個索引:
· 來自列規定的允許的值列中的值從1開始編號。
· 空字符串錯誤值的索引值是0。這說明你可以使用下面的SELECT語句來找出分配了非法ENUM值的行:
· mysql> SELECT * FROM tbl_name WHERE enum_col=0;
· NULL值的索引是NULL。
例如,定義為ENUM的列('one','two','three')可以有下面所示任何值。還顯示了每個值的索引:
值 |
索引 |
NULL |
NULL |
'' |
0 |
'one' |
1 |
'two' |
2 |
'three' |
3 |
枚舉最多可以有65,535個元素。
當創建表時,ENUM成員值的尾部空格將自動被刪除。
當檢索時,保存在ENUM列的值使用列定義中所使用的大小寫來顯示。請注意可以為ENUM列分配字符集和 校對規則。對於二進制或大小寫敏感的校對規則,當為列分配值時應考慮大小寫。
如果在數值上下文中檢索一個ENUM值,將返回列值的索引。例如,你可以這樣從ENUM列搜索數值值:
mysql> SELECT enum_col+0 FROM tbl_name;
如果將一個數字保存到ENUM列,數字被視為索引,並且保存的值是該索引對應的枚舉成員。(但是,這不適合LOAD DATA,它將所有輸入視為字符串)。不建議使用類似數字的枚舉值來定義一個ENUM列,因為這很容易引起混淆。例如,下面的列含有字符串值'0'、'1'和'2'的枚舉成員,但數值索引值為1、2和3:
numbers ENUM('0','1','2')
根據枚舉成員在列定義中列出的順序對ENUM值進行排序。(換句話說,ENUM值根據索引編號進行排序)。例如,對於ENUM('a','b'),'a'排在'b'前面,但對於ENUM('b','a'),'b'排在'a'前面。空字符串排在非空字符串前面,並且NULL值排在所有其它枚舉值前面。要想防止意想不到的結果,按字母順序規定ENUM列。還可以使用GROUP BY CAST(col AS CHAR)或GROUP BY CONCAT(col)來確保按照詞匯對列進行排序而不是用索引數字。
如果你想要確定一個ENUM列的所有可能的值,使用SHOW COLUMNS FROM tbl_name LIKE enum_col,並解析輸出中第2列的ENUM定義。