MySQL神功2.4 數(shù)據(jù)類(lèi)型的細(xì)分之字符串類(lèi)型
一、固定長(zhǎng)度與可變長(zhǎng)度字符串類(lèi)型
1、固定長(zhǎng)度字符串類(lèi)型CHAR(M)
這里的M代表該類(lèi)型可以存儲(chǔ)字符數(shù)量,取值范圍0~255。(不是字節(jié))
CHAR(0) :只能儲(chǔ)空字符串或者null
CHAR? 和? CHAR(1) 等價(jià),當(dāng)我們省略參數(shù)時(shí),CHAR默認(rèn)長(zhǎng)度為1個(gè)字符。
CHAR(2) :可以存儲(chǔ)2個(gè)字符
......
CHAR(255) : 可以存255個(gè)字符
問(wèn):那姓名字段我們用什么長(zhǎng)度?
答:這個(gè)....你問(wèn)我,我問(wèn)誰(shuí)呀?:)
張三
孫興華
斯琴高娃
斯琴格日樂(lè)
姓名是:司馬義某某某? 的人很多
你以為六個(gè)字就是上限了嗎?下面兩位明星
迪麗熱巴全名:? 迪麗熱巴?迪力木拉提
古力那扎全名:古力那扎爾·拜合提亞爾
你以為這就是上限了嗎?絕對(duì)不是!
所以說(shuō),這個(gè)問(wèn)題無(wú)論是你問(wèn)別人,還是問(wèn)自己,都沒(méi)有固定答案。
char(M):長(zhǎng)度固定, 即每條數(shù)據(jù)占用等長(zhǎng)字節(jié)空間;適合用于身份證號(hào)碼、手機(jī)號(hào)碼等。
在可視化界面,修改長(zhǎng)度即可

小貼士:如果用代碼新建字段,需要寫(xiě)成:CHAR(4)? ? 這個(gè)我們以后再講
問(wèn):你只說(shuō)了長(zhǎng)度,沒(méi)有說(shuō)存儲(chǔ)空間是多少字節(jié)呀?
答:這與你用什么樣的字符集有關(guān)系。
UTF-8字符集:長(zhǎng)度?x?一個(gè)字符最多需要3字節(jié) = 占用空間
我們以UTF-8字符集為例,CHAR(4)? 需要占用 4 * 3字節(jié) = 12字節(jié)
圖2-53中的W就是根據(jù)你使用的字符集而定的。

我現(xiàn)在用生活中的例子來(lái)講,你租一套3居室,每間屋子里一張單人床(限制你居住不能超過(guò)3人),你們兩個(gè)人住進(jìn)去,那么另一張空的單人床是用空氣填充的。當(dāng)有人口普查的工作人員來(lái)敲門(mén),只需要登記你們兩個(gè)人的信息,那個(gè)空氣就不用登記了。但是,這套3居租金7000元/月,限最高住3人,只住2個(gè)人是你自己的問(wèn)題,這租金是一分都不能少的。如果你有2個(gè)人,你可以租2居室。否則你就是在浪費(fèi)錢(qián)。
2、可變長(zhǎng)度字符串類(lèi)型VARCHAR(M)
這里的M代表該類(lèi)型可以存儲(chǔ)最大字符數(shù)量,取值范圍0~65535。(不是字節(jié))
其實(shí)這樣說(shuō)是不嚴(yán)謹(jǐn)?shù)?。因?yàn)檫@與字段采用的字符集有關(guān)。

utf-8 (utf8mb3)? ? ? ? ? varchar(21844)? ???? ? ?計(jì)算方法:65535/3≈21844
uft8mb4? ? ? ? ? ? ? ? ? ? ?varchar(16383)? ? ? ? ? 計(jì)算方法:65535/4≈16383

以u(píng)tf8mb4字集為例,【長(zhǎng)度】最大就到16383?? ?
注:我們現(xiàn)在用的MySQL 8.x版本已經(jīng)將utf8mb4做為默認(rèn)字符集了。

VAR在計(jì)算機(jī)語(yǔ)言中通常是定義變量的,比如 PowerBI的DAX語(yǔ)言、JS等
變量是什么?答:可以改變的值,這不就好理解了嗎?
上面,我們舉了一個(gè)姓名長(zhǎng)度的例子,如果你的企業(yè)中姓名長(zhǎng)度無(wú)法確定,可以使用可變長(zhǎng)度字符串類(lèi)型。如果你使用固定長(zhǎng)度字符串類(lèi)型,就好比2個(gè)人租3居室,浪費(fèi)錢(qián)浪費(fèi)空間。
問(wèn):那VARCHAR(M)中的 M有什么用?
答:M代表最多可以存多少個(gè)字符。一個(gè)宿舍里最多有8張床(上下鋪),可能只住了3個(gè)學(xué)生,我沒(méi)招夠?qū)W生,也不能把另外5張床的錢(qián)分?jǐn)偟侥銈?個(gè)學(xué)生身上呀。
問(wèn):那VARCHAR(M)占用多少字節(jié)?
答:
當(dāng) M x W < 256 時(shí),你輸入真實(shí)字符串字符數(shù)+1
當(dāng) M x W >=?256 時(shí),你輸入真實(shí)字符串字符數(shù)+2
M是你定義的長(zhǎng)度,W剛才我們講了依據(jù)字符集而定。我們以UTF-8為例,那W=3


當(dāng)我們將M提高到100的時(shí)候,你看看。。。。。CHAR類(lèi)型的劣勢(shì)就顯現(xiàn)出來(lái)了


CHAR與VARCHAR關(guān)于尾部空格的秘密
下圖中,新建固定和可變兩個(gè)字段

我輸入時(shí),張三后面都帶有三個(gè)空格

因?yàn)槲覀冃抡n程還沒(méi)有學(xué)習(xí)代碼,我們先引用老課程中的代碼做個(gè)實(shí)驗(yàn)

我們使用【固定】字段連接【可變】字段時(shí),空格就不顯示

當(dāng)我們使用【可變】字段連接【固定】字段時(shí),就顯示空格

總結(jié):CHAR與VARCHAR的區(qū)別
CHAR速度快,但是大多數(shù)情況下浪費(fèi)空間,會(huì)自動(dòng)刪除數(shù)據(jù)尾部的空格。
VARCHAR速度慢于CHAR,大多數(shù)情況下節(jié)省空間,不刪除數(shù)據(jù)尾部的空格。
二、四種TEXT類(lèi)型
(1)TINYTEXT:最大長(zhǎng)度為255字符。(指1個(gè)字節(jié)算一個(gè)字符的情況下)
以UTF-8字符集為例,1個(gè)英文字母1個(gè)字節(jié),1個(gè)漢字3個(gè)字節(jié),每個(gè)字符最多占3字節(jié)
如果使用TINYTEXT類(lèi)型來(lái)存儲(chǔ)漢字,那最多可以存255 / 3 = 85個(gè)漢字。
驗(yàn)證方法:在Word中輸入86個(gè)漢字(左下角有顯示字?jǐn)?shù)),復(fù)制到記事本,在從記事本復(fù)制到MySQL表中的TINYTEXT類(lèi)型的字段,是無(wú)法保存的,刪除一個(gè)漢字,就可以了保存了。
但是當(dāng)我使用utf8mb4字符集時(shí)也只能保存85個(gè)漢字,這就奇怪了,于是我查詢(xún)了MySQL官方手冊(cè)中對(duì)于utf8mb4的解釋是:

我的疑問(wèn)是:
既然在utf8mb4仍然是255 / 3 = 85個(gè)漢字,那為什么varchar(M)新建字段時(shí)M的最大值在utf8mb4下就要用65535/4=16383,而不是65535/3呢
我有一個(gè)大膽的猜測(cè),當(dāng)新建字段的時(shí)候,utf8mb4會(huì)考慮到你將來(lái)會(huì)不會(huì)保存特殊字符(補(bǔ)充字符),所以它默認(rèn)是最多4個(gè)字節(jié)一個(gè)字符來(lái)新建字段。但是,在實(shí)際中,你只有BMP字符,沒(méi)有補(bǔ)充字符時(shí),他仍然按最多3個(gè)字節(jié)一個(gè)漢字的標(biāo)準(zhǔn)。建議大家在文章評(píng)論區(qū)發(fā)表自己的觀點(diǎn),看看我的猜測(cè)是否正確。
小伙伴可能會(huì)有疑問(wèn),補(bǔ)充字符是什么?BMP字符是你常用的,特殊字符(補(bǔ)充字符)例如像4字節(jié)emoji表情就是,代表字符:???? .....這些表情包。
MySQL 中的 utf8(utf8mb3) 編碼并不是真正的 UTF-8,而是閹割版的,最長(zhǎng)只有3個(gè)字節(jié)。
當(dāng)遇到占4個(gè)字節(jié)的 UTF-8 編碼,會(huì)存儲(chǔ)異常。從 5.5.3 開(kāi)始,MySQL 開(kāi)始用 utf8mb4 編碼來(lái)實(shí)現(xiàn)完整的 UTF-8,其中 mb4 表示 most bytes 4,最多占用4個(gè)字節(jié)。到了8.0后的版本, utf8mb4 作為默認(rèn)字符編碼。
你理解了TINYTEXT類(lèi)型,后面3個(gè)類(lèi)型無(wú)非是容量大小的問(wèn)題,根據(jù)你自己情況使用
(2)TEXT:最大長(zhǎng)度為65536字符。(指1個(gè)字節(jié)算一個(gè)字符的情況下)
(3)MEDIUMTEXT:最大長(zhǎng)度為16777215字符。(指1個(gè)字節(jié)算一個(gè)字符的情況下)
(4)LONGTEXT:最大長(zhǎng)度為4294967295字符。(指1個(gè)字節(jié)算一個(gè)字符的情況下)
三、ENUM類(lèi)型(普通話:?jiǎn)芜x)
例如,在性別輸入時(shí),我們可以選擇男或女,可以通過(guò)下拉菜單選擇

注意,這個(gè)字段類(lèi)型在Navicat for MySQL中的使用方法
首先新建表時(shí)我們輸入字段名、字段類(lèi)型,然后下面箭頭指示位置

在彈出的對(duì)話框中輸入相關(guān)值,通過(guò)+號(hào)新增行(-?號(hào)是刪除行),然后點(diǎn)確定

這時(shí),字符串會(huì)出現(xiàn)在下面,切記,不可以手工在這里直接輸入。

你會(huì)發(fā)現(xiàn),ENUM類(lèi)型的默認(rèn)值是NULL,如果你想讓他將第幾個(gè)元素設(shè)置為默認(rèn)值,只需要默認(rèn)那里的下拉菜單中選擇你的默認(rèn)值。

還有一個(gè)小技巧,就是在這里的? "男","女"? ?就好比一個(gè)班級(jí)中的學(xué)生,從1~n都是有學(xué)號(hào)的,ENMU類(lèi)型的學(xué)號(hào)叫索引,1="男"?, ?2="女"? 如果還有其它元素,以此類(lèi)推,?我們可以輸入數(shù)字,保存再打開(kāi)后,就會(huì)根據(jù)索引顯示他們的值


ENUM類(lèi)型最多可以有65535個(gè)元素。(這個(gè)本人沒(méi)有核實(shí)過(guò),因?yàn)槲覀€(gè)人使用時(shí),最多就是10個(gè)左右,再多,就好比大海里撈針,不現(xiàn)實(shí)了)
四、SET類(lèi)型(普通話:多選)
SET類(lèi)型最多64個(gè)元素。(這個(gè)本人沒(méi)有核實(shí)過(guò),實(shí)際使用中我個(gè)人沒(méi)有使用超過(guò)10個(gè)元素的場(chǎng)景)
添加元素的方法與ENMU一樣,都要從箭頭處添加。

我們今后在表中就可以多選了

最后顯示的結(jié)果是:

注意這里輸入的值不能重復(fù),例如,我們輸入兩次吃飯

點(diǎn)確定后雖然顯示正常

但是保存的時(shí)候會(huì)告訴你不行

因?yàn)槲覀儸F(xiàn)在還沒(méi)有進(jìn)入代碼部分,將來(lái)學(xué)習(xí)寫(xiě)代碼時(shí),還會(huì)有更多注意事項(xiàng),我們到時(shí)再說(shuō)。

MySQL合集教程: