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