中文只占一个字符_一文搞懂字符和字节的含义
前言
我們?cè)跀?shù)據(jù)庫(kù)建表時(shí),經(jīng)常會(huì)困擾某個(gè)字段應(yīng)該選擇什么數(shù)據(jù)類型,以及填寫什么長(zhǎng)度。選擇數(shù)據(jù)類型方面一般沒什么大問題,但是在填寫對(duì)應(yīng)的長(zhǎng)度的時(shí)候,很多人就會(huì)困擾,對(duì)應(yīng)長(zhǎng)度填寫的數(shù)字到底是什么含義,以及會(huì)影響到哪些東西。筆者在翻閱網(wǎng)上的相關(guān)文章時(shí),發(fā)現(xiàn)一大半文章寫的都是錯(cuò)的,主要的問題在于搞混了“字符”和“字節(jié)”這兩者的含義,甚至有的人覺得這就是一回事。本文首先先來(lái)講解“字符”和“字節(jié)”這兩者的含義,然后在下一篇文章介紹MySQL的數(shù)據(jù)類型中長(zhǎng)度的含義。
字符
以下是百科對(duì)字符的定義:
字符指類字形單位或符號(hào),包括字母、數(shù)字、運(yùn)算符號(hào)、標(biāo)點(diǎn)符號(hào)和其他符號(hào),以及一些功能性符號(hào)。為了方便理解,你可以將字符簡(jiǎn)單地理解為你可以用輸入法單獨(dú)打出的任何單個(gè)的內(nèi)容。對(duì)于中文和英文而言,以下內(nèi)容分別都是1個(gè)字符:
(1)1個(gè)中文字,例如“是”
(2)1個(gè)英文字母,例如“T”
(3)1個(gè)中文標(biāo)點(diǎn)符號(hào),例如“。”
(4)1個(gè)英文標(biāo)點(diǎn)符號(hào),例如“.”
所謂的“字符串”就是由以上說的一個(gè)個(gè)字符組成的,字符串就是由一個(gè)個(gè)字符拼接而成的列表,以下是Javascript代碼演示:
const在MySQL中,你可以使用 CHAR_LENGTH() 函數(shù),查看指定字符串的字符數(shù)。例如:
SELECT字節(jié)
字符就介紹到這里,接下去說字節(jié)。百科給的定義是:
字節(jié)(Byte)是計(jì)算機(jī)信息技術(shù)用于計(jì)量存儲(chǔ)容量的一種計(jì)量單位。如果你只是在紙上寫字,那么就用不到字節(jié),但是如果你要把字存入電腦,就需要占用一定的磁盤空間。我們知道,電腦只能用高電位、低電位的形式存儲(chǔ)數(shù)據(jù),抽象出來(lái),那就是電腦存數(shù)據(jù)最終只能用二進(jìn)制的形式,也就是用0和1表示,無(wú)論任何數(shù)據(jù),最終存儲(chǔ)的時(shí)候都是一段包含多個(gè)0和1的串,例如“00110101”,這里的每一個(gè)0或1被稱為1位。“位”就是最小的存儲(chǔ)單位,然后我們把8位稱為1個(gè)字節(jié),也就是1個(gè)字節(jié)等于8位。這個(gè)概念類似于“1公里=1000米”,本質(zhì)上是一回事,只是使用不同級(jí)別的單位而已。由于二進(jìn)制實(shí)在太長(zhǎng),不方便展示,所以一般將1個(gè)字節(jié)(8位)的二進(jìn)制轉(zhuǎn)換成十六進(jìn)制進(jìn)行展示,例如將11010011轉(zhuǎn)換成十六進(jìn)制就是D3,這就是一個(gè)字節(jié)。
你沒有辦法直接在電腦里面存入字符,例如你沒有辦法將“你好世界”這四個(gè)字進(jìn)行存儲(chǔ),現(xiàn)行的方案是將字符編碼成0和1數(shù)字串的形式,兩者建立映射關(guān)系。例如你可以用“1”表示“你”,用“10”表示“好”,用“101”表示“世”,用“111”表示“界”。反過來(lái)講,如果你發(fā)現(xiàn)磁盤某一段地方存了“101”,那你就知道這里代表著“世”這個(gè)中文字。
當(dāng)然以上的這個(gè)方案只是一套勉強(qiáng)行得通的方案,這種方案很多,我們把這種方案叫做“字符集”。我們?cè)谑褂肕ySQL時(shí),最常用的字符集就是 UTF-8 。這個(gè)字符集和上面說的這個(gè)方案沒有本質(zhì)區(qū)別,只是建立映射關(guān)系不同而已。
我們可以看下字符“你”在UTF-8字符集下的表示方式,在MySQL中你可以直接使用 HEX() 函數(shù)來(lái)進(jìn)行轉(zhuǎn)換。
SELECT HEX('你') -- E4BDA0可以看出,使用UTF-8字符集,字符“你”需要使用3個(gè)字節(jié)來(lái)進(jìn)行存儲(chǔ)(分別是E4,BD,A0),實(shí)際存儲(chǔ)的二進(jìn)制是
111001001011110110100000再次說明,E4BDA0 只是 111001001011110110100000 的簡(jiǎn)寫形式,兩者本質(zhì)上是一回事。
我們繼續(xù)看一下,存儲(chǔ)一個(gè)英文字符需要占用多少字節(jié)。
SELECT HEX('Z') -- 5A可以看到,存儲(chǔ)英文字符“Z”只需要一個(gè)字節(jié)。
在MySQL中,你可以直接使用 LENGTH() 函數(shù)來(lái)查看指定字符串占用的空間(字節(jié)數(shù))。
SELECT LENGTH('你') -- 3 SELECT LENGTH('Z') -- 1 SELECT LENGTH('A啊a1') -- 6你可以直接記住結(jié)論:在UTF-8字符集下,一個(gè)中文字符占用3個(gè)字節(jié),一個(gè)英文字符占用1個(gè)字節(jié)。如果要計(jì)算字符串占用的字節(jié)數(shù),只需要按照這個(gè)方式想加即可。
更容易理解的例子
如果通過以上的講解還不能理解字符和字節(jié)的關(guān)系,我們?cè)賮?lái)講一個(gè)更容易理解的例子。
比如某種飲料有大瓶3升的和小瓶1升的,但是無(wú)論“大瓶”的還是“小瓶”的,我們都稱為“1瓶”。如果你將飲料導(dǎo)入飲料桶中,將大瓶倒入的時(shí)候要占用3升的空間,倒小瓶的時(shí)候,只需要占1升的空間。
上面例子說的“1瓶”飲料,對(duì)應(yīng)1個(gè)字符,這是一個(gè)抽象概念,人為定義的。但是1個(gè)字符占用的空間各有不同,1個(gè)中文字符占用3個(gè)字節(jié),1個(gè)英文字符占用1個(gè)字節(jié),對(duì)應(yīng)以上大瓶和小瓶的飲料倒入飲料桶占用的空間。
通過本文的講解,你應(yīng)該已經(jīng)理解了字符和字節(jié)的含義,下一篇文章我們講解MySQL的數(shù)據(jù)類型中長(zhǎng)度的含義。
總結(jié)
以上是生活随笔為你收集整理的中文只占一个字符_一文搞懂字符和字节的含义的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 生产假泰国香米被“3·15”点名 安徽永
- 下一篇: 汇编对sp指针进行修改_从汇编理解函数调