首頁 > 軟體

MySQL資料型別之淺談字串(string)

2022-10-04 14:00:23

字元型別(CHAR Types)

CREATE TABLE t1 (c1 CHAR(10));

該語句建立了一張t1表,表中只有一個欄位c1,型別為char,char(10)括號中的10表示欄位c1最多能夠儲存10個字元。

char最多可以儲存255個字元,最小可以儲存0個字元。

可以如下向表中插入資料:

INSERT INTO t1 (c1) VALUES('');
INSERT INTO t1 (c1) VALUES('xy');
INSERT INTO t1 (c1) VALUES('0123456789');

該語句向c1字元中分別插入了長度為0,2和10的三個字元,可以如下查詢資料:

select * from t1

結果如圖:

雖然插入了兩條不足10個字元的資料,但是MySQL在儲存char型別資料時,仍然佔用10個字元個空間,它在不足10個字元的右邊新增空白字元補足10個字元長度,所以char型別儲存時的長度是固定的。

可以如下查詢字元長度:

SELECT c1, CHAR_LENGTH(c1) FROM t1;

結果如圖:

有人肯定要問,剛剛不是說每個值都應該是10個字元長度嗎?沒錯。但是MySQL在查詢char型別資料時,預設做了一個處理,它將值後面的所有空格全部移除,然後再將結果返回給我們。

也就是上面的這個結果。可以如下來取消這個處理

SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';

再次執行上面的這個查詢,結果是:

圖中豎線是滑鼠遊標位置,遊標前面就是10個空白字元。

可變字元型別(Varchar Types)

varchar型別和char型別非常相似。如下建立一張表t2

CREATE TABLE t2 (c1 VARCHAR(10));

該表c1欄位是varchar型別,10也是表示c1字元能夠儲存的最大字元長度。如下向表中插入三條資料

INSERT INTO t2 (c1) VALUES('');
INSERT INTO t2 (c1) VALUES('xy');
INSERT INTO t2 (c1) VALUES('0123456789');

不同的是MySQL在儲存VARCHAR型別時,儲存實際長度,也就是說儲存c1欄位的值時分別佔用0、2和10個字元空間(實際要大1-2個位元組用於儲存字元長度),這點和char型別是不同的。

可以執行如下語句來驗證

SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
SELECT c1, CHAR_LENGTH(c1) FROM t2;

設定sql_mode之前和之後,c1的長度不變,如圖:

varchar型別能夠儲存最多65535個字元,但是需要注意,不是每個表的欄位都能申請到這個長度,因為MySQL對單行的大小限制為65535個位元組,也就是表的一行的所有欄位大小的和不能超過65535個位元組。如果其他欄位已經申請了比較大的空間,那麼c1欄位可能就不能申請65535個字元空間了。

(1)儲存超過定義時指定長度的字元

這個由sql_mode決定,在strict mode下,插入失敗並報錯,在非strict mode會插入成功,超過部分會被擷取掉,如圖:

strict mode:

重新設定sql_mode變數,再插入:

二進位制型別(BINARY Types)

binary型別和char型別很相似,binary型別儲存的是位元組串而不是字串,儲存的最大位元組串長度也是255,binary型別儲存不足長度的值時也是在值的右邊進行補全,不過用於補全的值是0x00(字元表示為''),但查詢時會保留尾部補全的值。

例如對於BINARY(3),插入'a '時,儲存的是'a ',插入'a'時,儲存的是'a',查詢時分別是'a '和'a'。

可以如下驗證

CREATE TABLE t3 (c BINARY(3));
INSERT INTO t3 VALUES('a');
SELECT c,CHAR_LENGTH(c),HEX(c),c = 'a', c = 'a' from t3;

結果如圖:

說明查詢到的是'a',不過顯示的是a。

可變二進位制型別(VARBINARY Types)

varbinary和varchar類似,儲存的是位元組串,儲存的最大位元組長度為65535,儲存實際定義的位元組長度,不會在尾部用''補全,查詢時當然也就沒有移除尾部補全的值。

二進位制大物件型別(BLOB Types)

blob型別可以看成是varbinary型別,可以儲存超大二進位制資料。

根據儲存長度不同又分為四種: TINYBLOB, BLOB, MEDIUMBLOB, 和 LONGBLOB。

文字型別(Text Types)

text可以看成是varchar,可以儲存超大的字串資料。

根據儲存長度不同又分為四種:TINYTEXT, TEXT,MEDIUMTEXT和 LONGTEXT.

列舉型別(ENUM Type)

列舉型別主要用於某個列的取值只有有限的幾個,比如表示星期幾的列,只會是星期一,星期二,...,星期日這個值。

可以如下建立列舉型別:

CREATE TABLE shirts (
    name VARCHAR(40),
    size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
);

 如下插入一些資料

INSERT INTO shirts (name, size) VALUES 
('dress shirt','large'),
('t-shirt','medium'),
('polo shirt','ss');

結果如下:

當插入的值不在列舉型別中,size中會是空白。可以通過索引進行查詢:

select * from shirts where size=4

等價於

select * from shirts where size='larger'

'x-small', 'small', 'medium', 'large', 'x-large'的索引分別是1,2,3,4,NULL的索引是NULL,空字串''的索引是0。

列舉型別中可以有65535個不同的取值。

集合型別(SET Type)

有時候,一個列的取值只可能是有限個值的不重複組合,如下建立集合型別

CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));

插入資料: 

INSERT INTO myset (col) VALUES 
('a,d'),
('d,a'), 
('a,d,a'), 
('a,d,d'), 
('d,a,d');

結果如圖:

從結果來看,集合型別中的集合就是數學中的集合,滿足無序和不重複。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com