日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

mysql的binary、char、varchar区别

發(fā)布時(shí)間:2024/4/18 数据库 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql的binary、char、varchar区别 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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ù)列類型

?

類型最大長(zhǎng)度占用存儲(chǔ)空間
CHAR[(M)]M字節(jié)M字節(jié)
VARCHAR[(M)]M字節(jié)L+1字節(jié)
TINYBLOD,TINYTEXT2^8-1字節(jié)L+1字節(jié)
BLOB,TEXT2^16-1字節(jié)L+2
MEDIUMBLOB,MEDIUMTEXT2^24-1字節(jié)L+3
LONGBLOB,LONGTEXT2^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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。