在mysql中,漢字可以用CHAR和VARCHAR類型。CHAR和VARCHAR類型聲明的長(zhǎng)度表示用戶想要保存的最大字符數(shù)?!癈HAR(M)”為固定長(zhǎng)度字符串,在定義時(shí)指定字符串列長(zhǎng);M表示列的長(zhǎng)度,范圍是“0~255”個(gè)字符?!癡ARCHAR(M)”是長(zhǎng)度可變的字符串,M表示最大列的長(zhǎng)度,范圍是“0~65535”。
本教程操作環(huán)境:windows7系統(tǒng)、mysql8版本、Dell G3電腦。
mysql定義漢字存儲(chǔ)類型
mysql手冊(cè)上說:
在MySQL 5.x版本中,CHAR和VARCHAR類型聲明的長(zhǎng)度表示你想要保存的最大字符數(shù)。例如,CHAR(30)可以占用30個(gè)字符。GBK內(nèi)碼的情況下,一個(gè)漢字占兩個(gè)字節(jié),但是在UTF-8內(nèi)碼的情況下,一個(gè)漢字需要占用三個(gè)字節(jié)。
什么是字符?
百度百科里說:
字符是指計(jì)算機(jī)中使用的字母、數(shù)字、字和符號(hào),包括:1、2、3、A、B、C、~!·#¥%……—*()——+等等。1個(gè)漢字字符存儲(chǔ)需要2個(gè)字節(jié),1個(gè)英文字符存儲(chǔ)需要1個(gè)字節(jié),2個(gè)數(shù)字為一個(gè)字節(jié)。例如在VB中求字符串的長(zhǎng)度時(shí),len(str(1234))=4,len(1234)=2。
字符是可使用多種不同字符方案或代碼頁(yè)來表示的抽象實(shí)體。例如,Unicode UTF-16 編碼將字符表示為 16 位整數(shù)序列,而 Unicode UTF-8 編碼則將相同的字符表示為 8 位字節(jié)序列。公共語(yǔ)言運(yùn)行庫(kù)使用 Unicode UTF-16(Unicode 轉(zhuǎn)換格式,16 位編碼形式)表示字符。
針對(duì)公共語(yǔ)言運(yùn)行庫(kù)的應(yīng)用程序使用編碼將字符表式形式從本機(jī)字符方案映射至其他方案。應(yīng)用程序使用解碼將字符從非本機(jī)方案映射至本機(jī)方案。
電腦和通訊設(shè)備會(huì)使用字符編碼的方式來表達(dá)字符。意思是指,會(huì)將一個(gè)字符指定給某個(gè)東西。傳統(tǒng)上,是代表整數(shù)量的位元序列,如此,則可透過網(wǎng)絡(luò)來傳輸,同時(shí)亦便于儲(chǔ)存。兩個(gè)常用的例子是ASCII和用于統(tǒng)一碼的UTF-8。根據(jù)谷歌的統(tǒng)計(jì),UTF-8是目前最常用于網(wǎng)頁(yè)的編碼方式。[1]相較于大部分的字符編碼把字符對(duì)應(yīng)到數(shù)字或位元串,摩斯密碼則是使用不定長(zhǎng)度的電子脈沖的序列來表現(xiàn)字符。
什么是字節(jié)?
字節(jié),英文名稱是Byte。Byte是Binary Term的縮寫。一個(gè)字節(jié)代表八個(gè)比特(bit)。它是通常被作為計(jì)算機(jī)信息計(jì)量單位,不論被存儲(chǔ)數(shù)據(jù)的類型為何。它也是程序設(shè)計(jì)語(yǔ)言里不可缺少的基本數(shù)據(jù)類型——整數(shù)。
Byte(字節(jié))可被縮寫成B,例如MB表示Megabyte;Bit(比特)可被縮寫成b,例如Mb表示Megabit。
那么如果我們想定義最大能存儲(chǔ)10個(gè)漢字的字段,該怎么定義呢?
有了上面的說明,應(yīng)該很明了了char(10)或者varchar(10)。我們來驗(yàn)證一下:
CREATE TABLE `t1` ( `str` varchar(10) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
登錄后復(fù)制
向表中插入下列數(shù)據(jù):
insert into `t1`(`str`) values ('一二三四五六七八九十'); insert into `t1`(`str`) values ('一二三四五六七八九十十一'); insert into `t1`(`str`) values ('abcdefghijklmnopqrst'); insert into `t1`(`str`) values ('1234567890123456');
登錄后復(fù)制
我們來查看下結(jié)果:
由此可以印證上面說的內(nèi)容,而且如果超出了定義的范圍,mysql會(huì)自動(dòng)截短,我們?cè)趯?shí)際應(yīng)用中應(yīng)該注意。
CHAR 和 VARCHAR 類型
CHAR(M) 為固定長(zhǎng)度字符串,在定義時(shí)指定字符串列長(zhǎng)。當(dāng)保存時(shí),在右側(cè)填充空格以達(dá)到指定的長(zhǎng)度。M 表示列的長(zhǎng)度,范圍是 0~255 個(gè)字符。
例如,CHAR(4) 定義了一個(gè)固定長(zhǎng)度的字符串列,包含的字符個(gè)數(shù)最大為 4。當(dāng)檢索到 CHAR 值時(shí),尾部的空格將被刪除。
VARCHAR(M) 是長(zhǎng)度可變的字符串,M 表示最大列的長(zhǎng)度,M 的范圍是 0~65535。VARCHAR 的最大實(shí)際長(zhǎng)度由最長(zhǎng)的行的大小和使用的字符集確定,而實(shí)際占用的空間為字符串的實(shí)際長(zhǎng)度加 1。
例如,VARCHAR(50) 定義了一個(gè)最大長(zhǎng)度為 50 的字符串,如果插入的字符串只有 10 個(gè)字符,則實(shí)際存儲(chǔ)的字符串為 10 個(gè)字符和一個(gè)字符串結(jié)束字符。VARCHAR 在值保存和檢索時(shí)尾部的空格仍保留。
【實(shí)例】下面將不同的字符串保存到 CHAR(4) 和 VARCHAR(4) 列,說明 CHAR 和 VARCHAR 之間的差別,如下表所示。
插入值 | CHAR(4) | 存儲(chǔ)需求 | VARCHAR(4) | 存儲(chǔ)需求 |
---|---|---|---|---|
' ' | ' ' | 4字節(jié) | '' | 1字節(jié) |
'ab' | 'ab ' | 4字節(jié) | 'ab' | 3字節(jié) |
'abc' | 'abc ' | 4字節(jié) | 'abc' | 4字節(jié) |
'abcd' | 'abcd' | 4字節(jié) | 'abcd' | 5字節(jié) |
'abcdef' | 'abcd' | 4字節(jié) | 'abcd' | 5字節(jié) |
【