前言
?歡迎來到小K的MySQL專欄,本節(jié)將為大家?guī)鞰ySQL字符串 | 二進(jìn)制類型類型的分享?
5 字符串類型
字符串類型用來存儲(chǔ)字符串?dāng)?shù)據(jù),還可以存儲(chǔ)圖片和聲音的二進(jìn)制數(shù)據(jù)。字符串可以區(qū)分或者不區(qū)分大小寫的串比較,還可以進(jìn)行正則表達(dá)式的匹配查找。
下表中列出了 MySQL 中的字符串?dāng)?shù)據(jù)類型,括號(hào)中的M
表示可以為其指定長度。
類型名稱 | 說明 | 長度范圍 | 占用的存儲(chǔ)空間 |
---|---|---|---|
CHAR(M) | 固定長度 | 0<=M<=255 | M 個(gè)字節(jié) |
VARCHAR(M) | 變長字符串 | 0<=M<=65535 | M+1個(gè)字節(jié) |
TINYTEXT | 非常小字符串 | 0<=L<=255 | L+1字節(jié) |
TEXT | 小的字符串 | 0<=L<=65535 | L+2字節(jié) |
MEDIUMTEXT | 中等大小的字符串 | 0<=L<=16777215 | L+3字節(jié) |
LONGTEXT | 大的字符串 | 0<=L<=4294967295 | L+4字節(jié) |
ENUM | 枚舉類型,只能有一個(gè)枚舉字符串值 | 0<=L<=65535 | 1或2個(gè)字節(jié),取決于枚舉值的數(shù)目 (最大值為65535) |
SET | 字符串集合,字符串對(duì)象可以有零個(gè)或 多個(gè)SET成員 | 0<=L<=64 | 1、2、3、4或8個(gè)字節(jié),取決于集合 成員的數(shù)量(最多64個(gè)成員) |
CHAR 和 VARCHAR 類型
CHAR 和 VARCHAR 類型都可以存儲(chǔ)比較短的字符串。
類型 | 特點(diǎn) | 長度 | 長度范圍 | 占用存儲(chǔ)空間 |
---|---|---|---|---|
CHAR(M) | 固定長度 | M | 0<=M<=255 | M個(gè)字節(jié) |
VARCHAR(M) | 可變長度 | M | 0<=M<=65535 | (實(shí)際長度+1/2)個(gè)字節(jié) |
CHAR類型:
-
CHAR(M) 為固定長度字符串,在定義時(shí)指定字符串長度。如果不指定,則默認(rèn)為1個(gè)字符。
-
如果保存時(shí),數(shù)據(jù)的實(shí)際長度比CHAR類型聲明的長度小,則會(huì)在
右側(cè)填充空格
以達(dá)到指定的長度。當(dāng)檢索 CHAR 值時(shí),尾部的空格將被刪除。 -
定義CHAR類型字段時(shí),申明的字段長度即為CHAR類型字段所占的存儲(chǔ)空間的字節(jié)數(shù)。
CREATE TABLE test_char
(
f1 CHAR,
f2 CHAR(5)
);
DESC test_char;
INSERT INTO test_char(f1) VALUES('h');
#Data too long for column 'f1' at row 1
INSERT INTO test_char(f1) VALUES('he');
INSERT INTO test_char(f1) VALUES('你');
INSERT INTO test_char(f2) VALUES('C語言');
#Data too long for column 'f2' at row 1
INSERT INTO test_char(f2) VALUES('C語言Plus');
#測(cè)試在右側(cè)填充的空格,會(huì)在查詢的時(shí)候去掉的情況
SELECT CONCAT(f2,'***') FROM test_char;
#注意:自己插入的空格也會(huì)被去掉
INSERT INTO test_char(f2) VALUES('fk ');
SELECT * FROM test_char;
VARCHAR類型:
-
VARCHAR(M) 定義時(shí),必須指定長度M,否則會(huì)報(bào)錯(cuò)。
-
VARCHAR(M)指的是能存儲(chǔ)M個(gè)字符,而實(shí)際占用的空間為字符串的實(shí)際長度加 1或者2。
-
VARCHAR 在值保存和檢索時(shí)尾部的空格仍保留。
#錯(cuò)誤,沒有指定長度
CREATE TABLE test_varchar
(
name VARCHAR
);
CREATE TABLE test_varchar
(
name VARCHAR(5)
);
INSERT INTO test_varchar VALUES('星星'),('太陽月亮');
#Data too long forcolumn 'NAME' at row 1
INSERT INTO test_varchar VALUES('星星太陽月亮');
TEXT 類型
TEXT用來保存文本類型的字符串,如文章內(nèi)容、評(píng)論等。當(dāng)保存或查詢 TEXT 列的值時(shí),不刪除尾部空格。
TEXT 類型分為 4 種:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。不同的 TEXT 類型的存儲(chǔ)空間和數(shù)據(jù)長度不同。
在向TEXT類型的字段插入數(shù)據(jù)時(shí),系統(tǒng)自動(dòng)按照實(shí)際長度存儲(chǔ),不需要預(yù)先定義長度。
類型 | 說明 | 大小(字節(jié)) |
---|---|---|
TINYTEXT | 小文本 | 0<=L<=255 |
TEXT | 普通文本 | 0<=L<=65535 |
MEDIUMTEXT | 中等大小文本 | 0<=L<=16777215 |
LONGTEXT | 長文本 | 0<=L<=4294967295 (相當(dāng)于4GB字符) |
TEXT文本類型,可以存儲(chǔ)比較大的文本段,搜索速度稍慢,因此如果不是特別大的內(nèi)容,建議使用CHAR,VARCHAR來替代。還有TEXT類型不用加默認(rèn)值,加了也沒用。
ENUM 類型
ENUM 類型也叫作枚舉類型,ENUM類型的取值范圍需要在定義字段是進(jìn)行指定。設(shè)置字段值時(shí),ENUM類型只允許從成員中選取單個(gè)值,不能一次選取多個(gè)值。如果創(chuàng)建的成員中有空格,尾部的空格將自動(dòng)被刪除。
類型 | 長度范圍 | 占用存儲(chǔ)空間 |
---|---|---|
ENUM | 1<=L<=65535 | 1或2個(gè)字節(jié) |
- ENUM 值在內(nèi)部用整數(shù)表示,每個(gè)枚舉值均有一個(gè)索引值;
- 列表值所允許的成員值從 1 開始編號(hào),MySQL 存儲(chǔ)的就是這個(gè)索引編號(hào),枚舉最多可以有 65535 個(gè)元素。
ENUM 值依照列索引順序排列,并且空字符串排在非空字符串前,NULL 值排在其他所有枚舉值前。
提示:ENUM 列總有一個(gè)默認(rèn)值。如果將 ENUM 列聲明為 NULL,NULL 值則為該列的一個(gè)有效值,并且默認(rèn)值為 NULL。如果 ENUM 列被聲明為 NOT NULL,其默認(rèn)值為允許的值列表的第 1 個(gè)元素。
- 查看enum字段的所有值
SELECT
column_type
FROM
information_schema. COLUMNS
WHERE
#TABLE_SCHEMA = "test" AND
DATA_TYPE = 'enum'
AND table_name="test_enum"
AND column_name="ch";
- 測(cè)試
CREATE TABLE test_enum
(
gender ENUM('男','女','unknown')
);
INSERT INTO test_enum VALUES('男');
#Data truncated for column 'ch' at row 1
INSERT INTO test_enum VALUES('中');
#可以使用索引來插入枚舉元素(注意:索引從1開始)
INSERT INTO test_enum VALUES(1),('2');
#當(dāng)enum字段沒有申明為NOT NULL時(shí),插入NULL也是合法的
INSERT INTO test_enum VALUES(NULL);
SELECT * FROM test_enum;
SET 類型
SET 是一個(gè)字符串的對(duì)象,可以有零或多個(gè)值,SET 列最多可以有 64 個(gè)成員,值為表創(chuàng)建時(shí)規(guī)定的一列值。
成員個(gè)數(shù)范圍 | 占用的存儲(chǔ)空間 |
---|---|
1<=L<=8 | 1個(gè)字節(jié) |
9<=L<=16 | 2個(gè)字節(jié) |
17<=L<=24 | 3個(gè)字節(jié) |
25<=L<=32 | 4個(gè)字節(jié) |
33<=L<=64 | 8個(gè)字節(jié) |
-
與 ENUM 類型相同,SET 值在內(nèi)部用整數(shù)表示,列表中每個(gè)值都有一個(gè)索引編號(hào)。當(dāng)創(chuàng)建表時(shí),SET 成員值的尾部空格將自動(dòng)刪除。
-
但與 ENUM 類型不同的是,ENUM 類型的字段只能從定義的列值中選擇一個(gè)值插入,而 SET 類型的列可從定義的列值中選擇多個(gè)字符的聯(lián)合。
提示:如果插入 SET 字段中的列值有重復(fù),則 MySQL 自動(dòng)刪除重復(fù)的值;插入 SET 字段的值的順序并不重要,MySQL 會(huì)在存入數(shù)據(jù)庫時(shí),按照定義的順序顯示;
測(cè)試
CREATE TABLE test_set
(
hobby SET('吃飯','睡覺','寫B(tài)ug')
);
INSERT INTO test_set VALUES('吃飯');
INSERT INTO test_set VALUES('吃飯,睡覺');
#重復(fù)插入時(shí),會(huì)自動(dòng)刪除重復(fù)數(shù)據(jù)
INSERT INTO test_set VALUES('吃飯,睡覺,吃飯');
#插入的值在set中不存在時(shí),會(huì)報(bào)錯(cuò)
INSERT INTO test_set VALUES('吃飯,睡覺,花錢');
SELECT * FROM test_set;
6 二進(jìn)制類型
MySQL中的二進(jìn)制字符串類型主要存儲(chǔ)一些二進(jìn)制數(shù)據(jù),比如可以存儲(chǔ)圖片、音頻、視頻等二進(jìn)制數(shù)據(jù)。
包括 BIT、BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。
下表中列出了 MySQL 中的二進(jìn)制數(shù)據(jù)類型,括號(hào)中的M
表示可以為其指定長度。
類型名稱 | 說明 | 大小(字節(jié)) |
---|---|---|
BIT(M) | 位字段類型 | 大約 (M+7)/8 字節(jié) |
BINARY(M) | 固定長度二進(jìn)制字符串 | M 字節(jié) |
VARBINARY (M) | 可變長度二進(jìn)制字符串 | M+1 字節(jié) |
TINYBLOB (M) | 非常小的BLOB | L+1 字節(jié),在此,L<2^8 |
BLOB (M) | 小 BLOB | L+2 字節(jié),在此,L<2^16 |
MEDIUMBLOB (M) | 中等大小的BLOB | L+3 字節(jié),在此,L<2^24 |
LONGBLOB (M) | 非常大的BLOB | L+4 字節(jié),在此,L<2^32 |
BIT 類型
位字段類型。M 表示每個(gè)值的位數(shù),范圍為 1~64。如果 M 被省略,默認(rèn)值為 1。如果為 BIT(M) 列分配的值的長度小于 M 位,在值的左邊用 0 填充。例如,為 BIT(6) 列分配一個(gè)值 b’101’,其效果與分配 b’000101’ 相同。
BIT 數(shù)據(jù)類型用來保存位字段值,例如以二進(jìn)制的形式保存數(shù)據(jù) 13,13 的二進(jìn)制形式為 1101,在這里需要位數(shù)至少為 4 位的 BIT 類型,即可以定義列類型為 BIT(4)。大于二進(jìn)制 1111 的數(shù)據(jù)是不能插入 BIT(4) 類型的字段中的。
提示:默認(rèn)情況下,MySQL 不可以插入超出該列允許范圍的值,因而插入數(shù)據(jù)時(shí)要確保插入的值在指定的范圍內(nèi)。
BINARY 和 VARBINARY 類型
BINARY 和 VARBINARY 類型類似于 CHAR 和 VARCHAR,不同的是它們包含二進(jìn)制字節(jié)字符串。使用的語法格式如下:
列名稱 BINARY(M) 或者 VARBINARY(M)
BINARY 類型的長度是固定的,指定長度后,不足最大長度的,將在它們右邊填充 “\0” 補(bǔ)齊,以達(dá)到指定長度。例如,指定列數(shù)據(jù)類型為 BINARY(3),當(dāng)插入 a 時(shí),存儲(chǔ)的內(nèi)容實(shí)際為 “a\0\0”,當(dāng)插入 ab 時(shí),實(shí)際存儲(chǔ)的內(nèi)容為“ab\0”,無論存儲(chǔ)的內(nèi)容是否達(dá)到指定的長度,存儲(chǔ)空間均為指定的值 M。
VARBINARY 類型的長度是可變的,指定好長度之后,長度可以在 0 到最大值之間。例如,指定列數(shù)據(jù)類型為 VARBINARY(20),如果插入的值長度只有 10,則實(shí)際存儲(chǔ)空間為 10 加 1,實(shí)際占用的空間為字符串的實(shí)際長度加 1。
BLOB 類型
BLOB 是一個(gè)二進(jìn)制的對(duì)象,用來存儲(chǔ)可變數(shù)量的數(shù)據(jù)。BLOB 類型分為 4 種:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB,它們可容納值的最大長度不同,如下表所示。
數(shù)據(jù)類型 | 存儲(chǔ)范圍 |
---|---|
TINYBLOB | 最大長度為255 (28-1)字節(jié) |
BLOB | 最大長度為65535 (216-1)字節(jié) |
MEDIUMBLOB | 最大長度為16777215 (224-1)字節(jié) |
LONGBLOB | 最大長度為4294967295或4GB (231-1)字節(jié) |
BLOB 列存儲(chǔ)的是二進(jìn)制字符串(字節(jié)字符串),TEXT 列存儲(chǔ)的是非進(jìn)制字符串(字符字符串)。BLOB 列是字符集,并且排序和比較基于列值字節(jié)的數(shù)值;TEXT 列有一個(gè)字符集,并且根據(jù)字符集對(duì)值進(jìn)行排序和比較。文章來源:http://www.zghlxwxcb.cn/news/detail-671494.html
總結(jié)
總的來說,選擇合適的數(shù)據(jù)類型可以提高數(shù)據(jù)庫的性能、節(jié)省存儲(chǔ)空間、確保數(shù)據(jù)的一致性和有效性,并方便進(jìn)行數(shù)據(jù)處理和計(jì)算。因此,在設(shè)計(jì)數(shù)據(jù)庫時(shí),選擇合適的數(shù)據(jù)類型非常重要。~下節(jié)帶來MySQL視圖的分享文章來源地址http://www.zghlxwxcb.cn/news/detail-671494.html
到了這里,關(guān)于【?MySQL | 數(shù)據(jù)類型(二)】字符串 | 二進(jìn)制類型的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!