MySQL數(shù)據(jù)類型之淺談字符串(string)
字符類型(CHAR Types)
CREATE TABLE t1 (c1 CHAR(10));
該語句創(chuàng)建了一張t1表,表中只有一個字段c1,類型為char,char(10)括號中的10表示字段c1最多能夠存儲10個字符。
char最多可以存儲255個字符,最小可以存儲0個字符。
可以如下向表中插入數(shù)據(jù):
INSERT INTO t1 (c1) VALUES(''); INSERT INTO t1 (c1) VALUES('xy'); INSERT INTO t1 (c1) VALUES('0123456789');
該語句向c1字符中分別插入了長度為0,2和10的三個字符,可以如下查詢數(shù)據(jù):
select * from t1
結(jié)果如圖:
雖然插入了兩條不足10個字符的數(shù)據(jù),但是MySQL在存儲char類型數(shù)據(jù)時,仍然占用10個字符個空間,它在不足10個字符的右邊添加空白字符補(bǔ)足10個字符長度,所以char類型存儲時的長度是固定的。
可以如下查詢字符長度:
SELECT c1, CHAR_LENGTH(c1) FROM t1;
結(jié)果如圖:
有人肯定要問,剛剛不是說每個值都應(yīng)該是10個字符長度嗎?沒錯。但是MySQL在查詢char類型數(shù)據(jù)時,默認(rèn)做了一個處理,它將值后面的所有空格全部移除,然后再將結(jié)果返回給我們。
也就是上面的這個結(jié)果??梢匀缦聛砣∠@個處理
SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
再次執(zhí)行上面的這個查詢,結(jié)果是:
圖中豎線是鼠標(biāo)光標(biāo)位置,光標(biāo)前面就是10個空白字符。
可變字符類型(Varchar Types)
varchar類型和char類型非常相似。如下創(chuàng)建一張表t2
CREATE TABLE t2 (c1 VARCHAR(10));
該表c1字段是varchar類型,10也是表示c1字符能夠存儲的最大字符長度。如下向表中插入三條數(shù)據(jù)
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個字節(jié)用于存儲字符長度),這點和char類型是不同的。
可以執(zhí)行如下語句來驗證
SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH'; SELECT c1, CHAR_LENGTH(c1) FROM t2;
設(shè)置sql_mode之前和之后,c1的長度不變,如圖:
varchar類型能夠存儲最多65535個字符,但是需要注意,不是每個表的字段都能申請到這個長度,因為MySQL對單行的大小限制為65535個字節(jié),也就是表的一行的所有字段大小的和不能超過65535個字節(jié)。如果其他字段已經(jīng)申請了比較大的空間,那么c1字段可能就不能申請65535個字符空間了。
(1)存儲超過定義時指定長度的字符
這個由sql_mode決定,在strict mode下,插入失敗并報錯,在非strict mode會插入成功,超過部分會被截取掉,如圖:
strict mode:
重新設(shè)置sql_mode變量,再插入:
二進(jìn)制類型(BINARY Types)
binary類型和char類型很相似,binary類型存儲的是字節(jié)串而不是字符串,存儲的最大字節(jié)串長度也是255,binary類型存儲不足長度的值時也是在值的右邊進(jìn)行補(bǔ)全,不過用于補(bǔ)全的值是0x00(字符表示為'\0'),但查詢時會保留尾部補(bǔ)全的值。
例如對于BINARY(3),插入'a '時,存儲的是'a \0',插入'a\0'時,存儲的是'a\0\0',查詢時分別是'a \0'和'a\0\0'。
可以如下驗證
CREATE TABLE t3 (c BINARY(3)); INSERT INTO t3 VALUES('a'); SELECT c,CHAR_LENGTH(c),HEX(c),c = 'a', c = 'a\0\0' from t3;
結(jié)果如圖:
說明查詢到的是'a\0\0',不過顯示的是a。
可變二進(jìn)制類型(VARBINARY Types)
varbinary和varchar類似,存儲的是字節(jié)串,存儲的最大字節(jié)長度為65535,存儲實際定義的字節(jié)長度,不會在尾部用'\0'補(bǔ)全,查詢時當(dāng)然也就沒有移除尾部補(bǔ)全的值。
二進(jìn)制大對象類型(BLOB Types)
blob類型可以看成是varbinary類型,可以存儲超大二進(jìn)制數(shù)據(jù)。
根據(jù)存儲長度不同又分為四種: TINYBLOB, BLOB, MEDIUMBLOB, 和 LONGBLOB。
文本類型(Text Types)
text可以看成是varchar,可以存儲超大的字符串?dāng)?shù)據(jù)。
根據(jù)存儲長度不同又分為四種:TINYTEXT, TEXT,MEDIUMTEXT和 LONGTEXT.
枚舉類型(ENUM Type)
枚舉類型主要用于某個列的取值只有有限的幾個,比如表示星期幾的列,只會是星期一,星期二,...,星期日這個值。
可以如下創(chuàng)建枚舉類型:
CREATE TABLE shirts ( name VARCHAR(40), size ENUM('x-small', 'small', 'medium', 'large', 'x-large') );
如下插入一些數(shù)據(jù)
INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'), ('polo shirt','ss');
結(jié)果如下:
當(dāng)插入的值不在枚舉類型中,size中會是空白??梢酝ㄟ^索引進(jìn)行查詢:
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)
有時候,一個列的取值只可能是有限個值的不重復(fù)組合,如下創(chuàng)建集合類型
CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
插入數(shù)據(jù):
INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
結(jié)果如圖:
從結(jié)果來看,集合類型中的集合就是數(shù)學(xué)中的集合,滿足無序和不重復(fù)。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL修改lower_case_table_names參數(shù)的方法實踐
本文主要介紹了MySQL修改lower_case_table_names參數(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05MySQL 主從復(fù)制數(shù)據(jù)不一致的解決方法
本文主要介紹了MySQL 主從復(fù)制數(shù)據(jù)不一致的解決方法,文中根據(jù)實例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03mysql自動化安裝腳本(ubuntu and centos64)
這篇文章主要介紹了mysql自動化安裝腳本(ubuntu and centos64),需要的朋友可以參考下2014-05-05mysql數(shù)據(jù)庫id主鍵自增加刪除后不連續(xù)如何解決
這篇文章主要介紹了mysql數(shù)據(jù)庫id主鍵自增加刪除后不連續(xù)的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03