mysql的binary、char、varchar区别
mysql的binary、char、varchar區(qū)別
?
分類:?Mysql/postgreSQL
2013-09-24 18:11:46
?
char使用固定長(zhǎng)度的空間進(jìn)行存儲(chǔ),char(4)存儲(chǔ)4個(gè)字符,根據(jù)編碼方式的不同占用不同的字節(jié),gbk編碼方式,不論是中文還是英文,每個(gè)字符占用2個(gè)字節(jié)的空間,utf8編碼方式,每個(gè)字符占用3個(gè)字節(jié)的空間。
?
- 如果需要存儲(chǔ)的字符串的長(zhǎng)度跟所有值的平均長(zhǎng)度相差不大,適合用char,如MD5。
- 對(duì)于經(jīng)常改變的值,char優(yōu)于varchar,原因是固定長(zhǎng)度的行不容易產(chǎn)生碎片。
- 對(duì)于很短的列,char優(yōu)于varchar,原因是varchar需要額外一個(gè)或兩個(gè)字節(jié)存儲(chǔ)字符串的長(zhǎng)度。
varchar保存可變長(zhǎng)度的字符串,使用額外的一個(gè)或兩個(gè)字節(jié)存儲(chǔ)字符串長(zhǎng)度,varchar(10),除了需要存儲(chǔ)10個(gè)字符,還需要1個(gè)字節(jié)存儲(chǔ)長(zhǎng)度信息(10),超過(guò)255的長(zhǎng)度需要2個(gè)字節(jié)來(lái)存儲(chǔ)
例外:Myisam引擎中使用ROW_FORMAT=FIXED時(shí),每行使用相同的空間,造成浪費(fèi)
char和varchar后面如果有空格,char會(huì)自動(dòng)去掉空格后存儲(chǔ),varchar雖然不會(huì)去掉空格,但在進(jìn)行字符串比較時(shí),會(huì)去掉空格進(jìn)行比較
binary保存二進(jìn)制字符串,它保存的是字節(jié)而不是字符,沒(méi)有字符集限制
binary(8)可以保存8個(gè)字符,每個(gè)字符占1個(gè)字節(jié),共占8個(gè)字節(jié)
進(jìn)行比較時(shí)是按字節(jié)進(jìn)行比較,而不是按字符(char),按字節(jié)比較比字符簡(jiǎn)單快速
按字符比較不區(qū)分大小寫(xiě),而binary區(qū)分大小寫(xiě),結(jié)尾使用\0填充,而不是空格
(出自:http://blog.sina.com.cn/s/blog_4de07d5e01010jc4.html)
--------------------------------------------------------------
ps:
對(duì)于binary類型的自動(dòng)補(bǔ)\0,例子如下:
baseno為binary(6)時(shí),執(zhí)行insert into base_info(baseno) values('6');
在表中baseno的值形式上表示為‘98\0\0\0\0’,自動(dòng)補(bǔ)\0,
所以在select的時(shí)候,必須如下:
select * from base_info where baseno='98\0\0\0\0';
----------------------------------------------------------------
字符串可以用來(lái)表示任何一種值,所以它是最基本的類型之一。我們可以用字符串類型來(lái)存儲(chǔ)圖象或聲音之類的二進(jìn)制數(shù)據(jù),也可存儲(chǔ)用gzip壓縮的數(shù)據(jù)。下表介紹了各種字符串類型:
Table 1.3. 字符串類數(shù)據(jù)列類型
?
| CHAR[(M)] | M字節(jié) | M字節(jié) |
| VARCHAR[(M)] | M字節(jié) | L+1字節(jié) |
| TINYBLOD,TINYTEXT | 2^8-1字節(jié) | L+1字節(jié) |
| BLOB,TEXT | 2^16-1字節(jié) | L+2 |
| MEDIUMBLOB,MEDIUMTEXT | 2^24-1字節(jié) | L+3 |
| LONGBLOB,LONGTEXT | 2^32-1字節(jié) | L+4 |
| ENUM('value1','value2',...) | 65535個(gè)成員 | 1或2字節(jié) |
| SET('value1','value2',...) | 64個(gè)成員 | 1,2,3,4或8字節(jié) |
L+1、L+2是表示數(shù)據(jù)列是可變長(zhǎng)度的,它占用的空間會(huì)根據(jù)數(shù)據(jù)行的增減面則改變。數(shù)據(jù)行的總長(zhǎng)度取決于存放在這些數(shù)據(jù)列里的數(shù)據(jù)值的長(zhǎng)度。 L+1或L+2里多出來(lái)的字節(jié)是用來(lái)保存數(shù)據(jù)值的長(zhǎng)度的。在對(duì)長(zhǎng)度可變的數(shù)據(jù)進(jìn)行處理時(shí),MySQL要把數(shù)據(jù)內(nèi)容和數(shù)據(jù)長(zhǎng)度都保存起來(lái)。
如果把超出字符串最大長(zhǎng)度的數(shù)據(jù)放到字符類數(shù)據(jù)列中,MySQL會(huì)自動(dòng)進(jìn)行截短處理。
ENUM和SET類型的數(shù)據(jù)列定義里有一個(gè)列表,列表里的元素就是該數(shù)據(jù)列的合法取值。如果試圖把一個(gè)沒(méi)有在列表里的值放到數(shù)據(jù)列里,它會(huì)被轉(zhuǎn)換為空字符串(“”)。
字符串類型的值被保存為一組連續(xù)的字節(jié)序列,并會(huì)根據(jù)它們?nèi)菁{的是二進(jìn)制字符串還是非二進(jìn)制字符而被區(qū)別對(duì)待為字節(jié)或者字符:
二進(jìn)制字符串被視為一個(gè)連續(xù)的字節(jié)序列,與字符集無(wú)關(guān)。MySQL把BLOB數(shù)據(jù)列和帶BINARY屬性的CHAR和VARCHAR數(shù)據(jù)列里的數(shù)據(jù)當(dāng)作二進(jìn)制值。
非二進(jìn)制字符串被視為一個(gè)連續(xù)排列的字符序列。與字符集有關(guān)。MySQL把TEXT列與不帶BINARY屬性的CHAR和VARCHAR數(shù)據(jù)列里的數(shù)據(jù)當(dāng)作二進(jìn)制值對(duì)待。
在MySQL4.1以后的版本中,不同的數(shù)據(jù)列可以使用不同的字符集。在MySQL4.1版本以前,MySQL用服務(wù)器的字符集作為默認(rèn)字符集。
非二進(jìn)制字符串,即我們通常所說(shuō)的字符串,是按字符在字符集中先后次序進(jìn)行比較和排序的。而二進(jìn)制字符串因?yàn)榕c字符集無(wú)關(guān),所以不以字符順序排序,而是以字節(jié)的二進(jìn)制值作為比較和排序的依據(jù)。下面介紹兩種字符串的比較方式:
二進(jìn)制字符串的比較方式是一個(gè)字節(jié)一個(gè)字節(jié)進(jìn)行的,比較的依據(jù)是兩個(gè)字節(jié)的二進(jìn)制值。也就是說(shuō)它是區(qū)分大小寫(xiě)的,因?yàn)橥粋€(gè)字母的大小寫(xiě)的數(shù)值編碼是不一樣的。
非二進(jìn)制字符串的比較方式是一個(gè)字符一個(gè)字符進(jìn)行的,比較的依據(jù)是兩個(gè)字符在字符集中的先后順序。在大多數(shù)字符集中,同一個(gè)字母的大小寫(xiě)往往有著相同的先后順序,所以它不區(qū)分大小寫(xiě)。
二進(jìn)制字符串與字符集無(wú)關(guān),所以無(wú)論按字符計(jì)算還是按字節(jié)計(jì)算,二進(jìn)制字符串的長(zhǎng)度都是一樣的。所以VARCHAR(20)并不表示它最多能容納 20個(gè)字符,而是表示它最多只能容納可以用20個(gè)字節(jié)表示出來(lái)的字符。對(duì)于單字節(jié)字符集,每個(gè)字符只占用一個(gè)字節(jié),所以這兩者的長(zhǎng)度是一樣的,但對(duì)于多字 節(jié)字符集,它能容納的字符個(gè)數(shù)肯定少于20個(gè)。
1.2.2.1. CHAR和VARCHAR
CHAR和VARCHAR是最常用的兩種字符串類型,它們之間的區(qū)別是:
CHAR是固定長(zhǎng)度的,每個(gè)值占用相同的字節(jié),不夠的位數(shù)MySQL會(huì)在它的右邊用空格字符補(bǔ)足。
VARCHAR是一種可變長(zhǎng)度的類型,每個(gè)值占用其剛好的字節(jié)數(shù)再加上一個(gè)用來(lái)記錄其長(zhǎng)度的字節(jié)即L+1字節(jié)。
CHAR(0)和VARCHAR(0)都是合法的。VARCHAR(0)是從MySQL4.0.2版開(kāi)始的。它們的作用是作為占位符或用來(lái)表示各種on/off開(kāi)關(guān)值。
如何選擇CHAR和VARCHAR,這里給出兩個(gè)原則:
- 如果數(shù)據(jù)都有相同的長(zhǎng)度,選用VARCHAR會(huì)多占用空間,因?yàn)橛幸晃挥脕?lái)存儲(chǔ)其長(zhǎng)度。如果數(shù)據(jù)長(zhǎng)短不一,選用VARCHAR能節(jié)省存儲(chǔ)空間。而CHAR不論字符長(zhǎng)短都需占用相同的空間,即使是空值也不例外。
- 如果長(zhǎng)度出入不大,而且是使用MyISAM或ISAM類型的表,則用CHAR會(huì)比VARCHAR好,因?yàn)镸yISAM和ISAM類型的表對(duì)處理固定長(zhǎng)度的行的效率高。
- 在一個(gè)數(shù)據(jù)表里,只要有一個(gè)數(shù)據(jù)列的長(zhǎng)度是可變的,則所有數(shù)據(jù)列的長(zhǎng)度將是可變的。MySQL會(huì)進(jìn)行自動(dòng)地轉(zhuǎn)換。一個(gè)例外,CHAR長(zhǎng) 度小于4的不會(huì)進(jìn)行自動(dòng)轉(zhuǎn)換,因?yàn)镸ySQL會(huì)認(rèn)為這樣做沒(méi)必要,節(jié)省不了多少空間。反而MySQL會(huì)把大量長(zhǎng)度小的VARCHAR轉(zhuǎn)換成CHAR,以減 少空間占用量。
?
總結(jié)
以上是生活随笔為你收集整理的mysql的binary、char、varchar区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: c++ 输入输出流关联
- 下一篇: mysql bit类型 使用select