MySQL CHAR、VARCHAR、TEXT、ENUM、SET(字符串類型)
字符串類型用來存儲字符串數據,還可以存儲圖片和聲音的二進制數據。字符串可以區分或者不區分大小寫的串比較,還可以進行正則表達式的匹配查找。
mysql 中的字符串類型有 CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT、ENUM、SET 等。
下表中列出了 MySQL 中的字符串數據類型,括號中的
VARCHAR 和 TEXT 類型是變長類型,其存儲需求取決于列值的實際長度(在前面的表格中用 L 表示),而不是取決于類型的最大可能尺寸。
例如,一個 VARCHAR(10) 列能保存一個最大長度為 10 個字符的字符串,實際的存儲需要字符串的長度 L 加上一個字節以記錄字符串的長度。對于字符 “abcd”,L 是 4,而存儲要求 5 個字節。
例如,CHAR(4) 定義了一個固定長度的字符串列,包含的字符個數最大為 4。當檢索到 CHAR 值時,尾部的空格將被刪除。
VARCHAR(M) 是長度可變的字符串,M 表示最大列的長度,M 的范圍是 0~65535。VARCHAR 的最大實際長度由最長的行的大小和使用的字符集確定,而實際占用的空間為字符串的實際長度加 1。
例如,VARCHAR(50) 定義了一個最大長度為 50 的字符串,如果插入的字符串只有 10 個字符,則實際存儲的字符串為 10 個字符和一個字符串結束字符。VARCHAR 在值保存和檢索時尾部的空格仍保留。
【實例】下面將不同的字符串保存到 CHAR(4) 和 VARCHAR(4) 列,說明 CHAR 和 VARCHAR 之間的差別,如下表所示。
對比結果可以看到,CHAR(4) 定義了固定長度為 4 的列,無論存入的數據長度為多少,所占用的空間均為 4 個字節。VARCHAR(4) 定義的列所占的字節數為實際長度加 1。
TEXT 類型分為 4 種:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。不同的 TEXT 類型的存儲空間和數據長度不同。
ENUM 類型的字段在取值時,能在指定的枚舉列表中獲取,而且一次只能取一個。如果創建的成員中有空格,尾部的空格將自動被刪除。
ENUM 值在內部用整數表示,每個枚舉值均有一個索引值;列表值所允許的成員值從 1 開始編號,MySQL 存儲的就是這個索引編號,枚舉最多可以有 65535 個元素。
例如,定義 ENUM 類型的列('first','second','third'),該列可以取的值和每個值的索引如下表所示。
ENUM 值依照列索引順序排列,并且空字符串排在非空字符串前,NULL 值排在其他所有枚舉值前。
但與 ENUM 類型不同的是,ENUM 類型的字段只能從定義的列值中選擇一個值插入,而 SET 類型的列可從定義的列值中選擇多個字符的聯合。
mysql 中的字符串類型有 CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT、ENUM、SET 等。
下表中列出了 MySQL 中的字符串數據類型,括號中的
M
表示可以為其指定長度。類型名稱 | 說明 | 存儲需求 |
---|---|---|
CHAR(M) | 固定長度非二進制字符串 | M 字節,1<=M<=255 |
VARCHAR(M) | 變長非二進制字符串 | L+1字節,在此,L< = M和 1<=M<=255 |
TINYTEXT | 非常小的非二進制字符串 | L+1字節,在此,L<2^8 |
TEXT | 小的非二進制字符串 | L+2字節,在此,L<2^16 |
MEDIUMTEXT | 中等大小的非二進制字符串 | L+3字節,在此,L<2^24 |
LONGTEXT | 大的非二進制字符串 | L+4字節,在此,L<2^32 |
ENUM | 枚舉類型,只能有一個枚舉字符串值 | 1或2個字節,取決于枚舉值的數目 (最大值為65535) |
SET | 一個設置,字符串對象可以有零個或 多個SET成員 | 1、2、3、4或8個字節,取決于集合 成員的數量(最多64個成員) |
VARCHAR 和 TEXT 類型是變長類型,其存儲需求取決于列值的實際長度(在前面的表格中用 L 表示),而不是取決于類型的最大可能尺寸。
例如,一個 VARCHAR(10) 列能保存一個最大長度為 10 個字符的字符串,實際的存儲需要字符串的長度 L 加上一個字節以記錄字符串的長度。對于字符 “abcd”,L 是 4,而存儲要求 5 個字節。
CHAR 和 VARCHAR 類型
CHAR(M) 為固定長度字符串,在定義時指定字符串列長。當保存時,在右側填充空格以達到指定的長度。M 表示列的長度,范圍是 0~255 個字符。例如,CHAR(4) 定義了一個固定長度的字符串列,包含的字符個數最大為 4。當檢索到 CHAR 值時,尾部的空格將被刪除。
VARCHAR(M) 是長度可變的字符串,M 表示最大列的長度,M 的范圍是 0~65535。VARCHAR 的最大實際長度由最長的行的大小和使用的字符集確定,而實際占用的空間為字符串的實際長度加 1。
例如,VARCHAR(50) 定義了一個最大長度為 50 的字符串,如果插入的字符串只有 10 個字符,則實際存儲的字符串為 10 個字符和一個字符串結束字符。VARCHAR 在值保存和檢索時尾部的空格仍保留。
【實例】下面將不同的字符串保存到 CHAR(4) 和 VARCHAR(4) 列,說明 CHAR 和 VARCHAR 之間的差別,如下表所示。
插入值 | CHAR(4) | 存儲需求 | VARCHAR(4) | 存儲需求 |
---|---|---|---|---|
' ' | ' ' | 4字節 | '' | 1字節 |
'ab' | 'ab ' | 4字節 | 'ab' | 3字節 |
'abc' | 'abc ' | 4字節 | 'abc' | 4字節 |
'abcd' | 'abcd' | 4字節 | 'abcd' | 5字節 |
'abcdef' | 'abcd' | 4字節 | 'abcd' | 5字節 |
對比結果可以看到,CHAR(4) 定義了固定長度為 4 的列,無論存入的數據長度為多少,所占用的空間均為 4 個字節。VARCHAR(4) 定義的列所占的字節數為實際長度加 1。
TEXT 類型
TEXT 列保存非二進制字符串,如文章內容、評論等。當保存或查詢 TEXT 列的值時,不刪除尾部空格。TEXT 類型分為 4 種:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。不同的 TEXT 類型的存儲空間和數據長度不同。
- TINYTEXT 表示長度為 255(28-1)字符的 TEXT 列。
- TEXT 表示長度為 65535(216-1)字符的 TEXT 列。
- MEDIUMTEXT 表示長度為 16777215(224-1)字符的 TEXT 列。
- LONGTEXT 表示長度為 4294967295 或 4GB(232-1)字符的 TEXT 列。
ENUM 類型
ENUM 是一個字符串對象,值為表創建時列規定中枚舉的一列值。其語法格式如下:<字段名> ENUM( '值1', '值1', …, '值n' )字段名指將要定義的字段,值 n 指枚舉列表中第 n 個值。
ENUM 類型的字段在取值時,能在指定的枚舉列表中獲取,而且一次只能取一個。如果創建的成員中有空格,尾部的空格將自動被刪除。
ENUM 值在內部用整數表示,每個枚舉值均有一個索引值;列表值所允許的成員值從 1 開始編號,MySQL 存儲的就是這個索引編號,枚舉最多可以有 65535 個元素。
例如,定義 ENUM 類型的列('first','second','third'),該列可以取的值和每個值的索引如下表所示。
值 | 索引 |
---|---|
NULL | NULL |
'' | 0 |
’first | 1 |
second | 2 |
third | 3 |
ENUM 值依照列索引順序排列,并且空字符串排在非空字符串前,NULL 值排在其他所有枚舉值前。
提示:ENUM 列總有一個默認值。如果將 ENUM 列聲明為 NULL,NULL 值則為該列的一個有效值,并且默認值為 NULL。如果 ENUM 列被聲明為 NOT NULL,其默認值為允許的值列表的第 1 個元素。
SET 類型
SET 是一個字符串的對象,可以有零或多個值,SET 列最多可以有 64 個成員,值為表創建時規定的一列值。指定包括多個 SET 成員的 SET 列值時,各成員之間用逗號,
隔開,語法格式如下:SET( '值1', '值2', …, '值n' )與 ENUM 類型相同,SET 值在內部用整數表示,列表中每個值都有一個索引編號。當創建表時,SET 成員值的尾部空格將自動刪除。
但與 ENUM 類型不同的是,ENUM 類型的字段只能從定義的列值中選擇一個值插入,而 SET 類型的列可從定義的列值中選擇多個字符的聯合。
提示:如果插入 SET 字段中的列值有重復,則 MySQL 自動刪除重復的值;插入 SET 字段的值的順序并不重要,MySQL 會在存入數據庫時,按照定義的順序顯示;如果插入了不正確的值,默認情況下,MySQL 將忽視這些值,給出警告。
beylze編程學院,一個分享編程知識和seo優化知識的網站。跟著beylze一起學習,每天都有進步。
通俗易懂,深入淺出,一篇文章只講一個知識點。
文章不深奧,不需要鉆研,在公交、在地鐵、在廁所都可以閱讀,隨時隨地漲姿勢。
文章不涉及代碼,不燒腦細胞,人人都可以學習。
當你決定關注beylze(公眾號:beylze),你已然超越了90%的其他從業者!