最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL數(shù)據(jù)類型varchar詳解

 更新時間:2014年03月17日 11:10:11   作者:  
這篇文章詳細(xì)介紹了MySQL數(shù)據(jù)類型varchar,探討varchar到底能存多長的數(shù)據(jù)、InnoDB和MyISAM中的varchar等問題,需要的朋友可以參考下
1、varchar(N)的邏輯意義
從MySQL4.1開始,varchar (N)中的N指的是該字段最多能存儲多少個字符(characters),不是字節(jié)數(shù)。
不管是一個中英文字符或者數(shù)字、或者一個漢字,都當(dāng)做一個字符。在4.1之前,N表示的是最大存儲的字節(jié)數(shù)(bytes)。
2、varchar(N)到底能存多長的數(shù)據(jù)
在mysql reference manual上,varchar最多能存儲65535個字節(jié)的數(shù)據(jù)。varchar 的最大長度受限于最大行長度(max row size,65535bytes)。65535并不是一個很精確的上限,可以繼續(xù)縮小這個上限。65535個字節(jié)包括所有字段的長度,變長字段的長度標(biāo)識(每個變長字段額外使用1或者2個字節(jié)記錄實際數(shù)據(jù)長度)、NULL標(biāo)識位的累計。
NULL標(biāo)識位,如果varchar字段定義中帶有default null允許列空,則需要需要1bit來標(biāo)識,每8個bits的標(biāo)識組成一個字段。一張表中存在N個varchar字段,那么需要(N+7)/8 (取整)bytes存儲所有的NULL標(biāo)識位。
如果數(shù)據(jù)表只有一個varchar字段且該字段DEFAULT NULL,那么該varchar字段的最大長度為65532個字節(jié),即65535-2-1=65532 bytes。
復(fù)制代碼 代碼如下:
CREATE TABLE `vchar1` (   `name` VARCHAR(65533)  NOT  NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `vchar2` (   `name` VARCHAR(65533)  NOT  NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

如果數(shù)據(jù)表只有一個varchar字段且該字段NOT NULL,那么該varchar字段的最大長度為65533個字節(jié),即65535-2=65533bytes。
復(fù)制代碼 代碼如下:
CREATE TABLE `vchar3` (   `name` VARCHAR(65532)  DEFAULT  NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `vchar4` (   `name` VARCHAR(65532)  DEFAULT  NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

來個略微復(fù)雜點的表結(jié)構(gòu),->
復(fù)制代碼 代碼如下:
CREATE TABLE `tv` (
`a` VARCHAR(100) DEFAULT NULL,
`b` VARCHAR(100) DEFAULT NULL,
`c` VARCHAR(100) DEFAULT NULL,
`d` VARCHAR(100) DEFAULT NULL,
`e` VARCHAR(100) DEFAULT NULL,
`f` VARCHAR(100) DEFAULT NULL,
`g` VARCHAR(100) DEFAULT NULL,
`h` VARCHAR(100) DEFAULT NULL,
`i` VARCHAR(N) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1

`i` varchar(N) DEFAULT NULL中N最大值可以為多少?
這樣計算:已知確定的字段長度為100*8  bytes,8個varchar(100)字段總共需要變長字段表示字節(jié)為1*8=8 bytes。每個NULL字段用1bit標(biāo)識,9個字段都是default null,那么需要用(9+7)/8bit = 2 bytes存儲NULL標(biāo)識位。65535-100*8-1*8-2 = 64725 > 256, 那么字段i的最大長度為64725  - 2 =64723 bytes,即N=64723 。
varchar到底能存多少個字符?這與使用的字符集相關(guān),latin1、gbk、utf8編碼存放一個字符分別需要占1、2、3個字節(jié)。
3、varchar物理存儲
在物理存儲上,varchar使用1到2個額外的字節(jié)表示實際存儲的字符串長度(bytes)。如果列的最大長度小于256個字節(jié),用一個字節(jié)表示(標(biāo)識)。如果最大長度大于等于256,使用兩個字節(jié)。
當(dāng)選擇的字符集為latin1,一個字符占用一個byte
varchar(255)存儲一個字符,一共使用2個bytes物理空間存儲數(shù)據(jù)實際數(shù)據(jù)長度和數(shù)據(jù)值。
varchar(256)存儲一個字符,使用2 bytes表示實際數(shù)據(jù)長度,一共需要3 bytes物理存儲空間。
varchar對于不同的RDBMS引擎,有不通的物理存儲方式,雖然有統(tǒng)一的邏輯意義。對于mysql的不同存儲引擎,其實現(xiàn)方法與數(shù)據(jù)的物理存放方式也不同。
4、InnoDB中的varchar
InnoDB中varchar的物理存儲方式與InnoDB使用的innodb_file_format有關(guān)。早期的innodb_file_forma使用的Antelope文件格式,支持redundant和compact兩種row_format。從5.5開始或者InnoDB1.1,可以使用一種新的file format,Barracuda。Barracuda兼容Redundant,另外還支持dynamic和compressed兩種row_format.
當(dāng)innodb_file_format=Antelope,ROW_FORMAT=REDUNDANT 或者COMPACT。
innodb的聚集索引(cluster index)僅僅存儲varchar、text、blob字段的前768個字節(jié),多余的字節(jié)存儲在一個獨立的overflow page中,這個列也被稱作off-page。768個字節(jié)前綴后面緊跟著20字節(jié)指針,指向overflow pages的位置。
另外,在innodb_file_format=Antelope情況下,InnoDB中最多能存儲10個大字段(需要使用off-page存儲)。innodbd的默認(rèn)page size為16KB,InnoDB單行的長度不能超過16k/2=8k個字節(jié),(768+20)*10 < 8k。
當(dāng)innodb_file_format=Barracuda, ROW_FORMAT=DYNAMIC 或者 COMPRESSED
innodb中所有的varchar、text、blob字段數(shù)據(jù)是否完全off-page存儲,根據(jù)該字段的長度和整行的總長度而定。對off-page存儲的列,cluster index中僅僅存儲20字節(jié)的指針,指向?qū)嶋H的overflow page存儲位置。如果單行的長度太大而不能完全適配cluster index page,innodb將會選擇最長的列作為off-page存儲,直到行的長度能夠適配cluster index page。
5、MyISAM中的varchar
對于MyISAM引擎,varchar字段所有數(shù)據(jù)存儲在數(shù)據(jù)行內(nèi)(in-line)。myisam表的row_format也影響到varchar的物理存儲行為。
MyISAM的row_format可以通過create或者alter sql語句設(shè)為fixed和dynamic。另外可以通過myisampack生成row_format=compresse的存儲格式。
當(dāng)myisam表中不存在text或者blob類型的字段,那么可以把row_format設(shè)置為fixed(也可以為dynamic),否則只能為dynamic。
當(dāng)表中存在varchar字段的時候,row_format可以設(shè)定為fixed或者dynamic。使用row_format=fixed存儲varchar字段數(shù)據(jù),浪費存儲空間,varchar此時會定長存儲。row_format為fixed和dynamic,varchar的物理實現(xiàn)方式也不同(可以查看源代碼文件field.h和field.cc),因而myisam的row_format在fixed和dynamic之間發(fā)生轉(zhuǎn)換的時候,varchar字段的物理存儲方式也將會發(fā)生變化。

相關(guān)文章

  • Mysql快速插入千萬條數(shù)據(jù)的實戰(zhàn)教程

    Mysql快速插入千萬條數(shù)據(jù)的實戰(zhàn)教程

    這篇文章主要給大家介紹了關(guān)于Mysql快速插入千萬條數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • MySQL批量刪除海量數(shù)據(jù)的幾種方法總結(jié)

    MySQL批量刪除海量數(shù)據(jù)的幾種方法總結(jié)

    在數(shù)據(jù)庫的日常維護(hù)中,我們經(jīng)常遇到需要刪除大量數(shù)據(jù)的場景,例如,刪除過期日志、清理歷史數(shù)據(jù)等,但如果一次性刪除大量數(shù)據(jù),可能會導(dǎo)致鎖表、事務(wù)日志暴增、影響數(shù)據(jù)庫性能等問題,本文將介紹幾種高效批量刪除 MySQL 海量數(shù)據(jù)的方法,需要的朋友可以參考下
    2024-11-11
  • 詳解MySql存儲過程參數(shù)的入門使用

    詳解MySql存儲過程參數(shù)的入門使用

    這篇文章主要介紹了MySql存儲過程參數(shù)的入門使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 利用rpm安裝mysql 5.6版本詳解

    利用rpm安裝mysql 5.6版本詳解

    眾所周知MySQL在很多領(lǐng)域都被廣泛的使用,尤其是很多互聯(lián)網(wǎng)企業(yè),諸如騰訊,阿里等等。那么本文將主要介紹如何通過rpm方式來安裝Mysql,這是比較簡單的一種安裝方式,文中介紹的很詳細(xì),相信對于大家安裝mysql具有一定的參考借鑒價值,下面來一起看看吧。
    2016-11-11
  • Mysql數(shù)據(jù)庫值的添加、修改、刪除及清空操作實例

    Mysql數(shù)據(jù)庫值的添加、修改、刪除及清空操作實例

    這篇文章主要給大家介紹了關(guān)于Mysql數(shù)據(jù)庫值的添加、修改、刪除及清空操作的相關(guān)資料,文中通過示例代碼以及圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2021-06-06
  • Mysql 主從數(shù)據(jù)庫同步(centos篇)

    Mysql 主從數(shù)據(jù)庫同步(centos篇)

    Mysql 主從數(shù)據(jù)庫同步(centos篇),需要的朋友可以參考下。
    2011-05-05
  • mysql 獲取規(guī)定時間段內(nèi)的統(tǒng)計數(shù)據(jù)

    mysql 獲取規(guī)定時間段內(nèi)的統(tǒng)計數(shù)據(jù)

    這篇文章主要介紹了mysql 獲取規(guī)定時間段內(nèi)的統(tǒng)計數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • mysql 的replace into實例詳解

    mysql 的replace into實例詳解

    這篇文章主要介紹了mysql 的replace into實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • MySQL外鍵使用及說明詳解

    MySQL外鍵使用及說明詳解

    MySQL通過外鍵約束來保證表與表之間的數(shù)據(jù)的完整性和準(zhǔn)確性。這篇文章還通過外鍵的使用條件和外鍵的好處定義語法方面介紹了mysql外鍵使用及說明,非常不錯,具有參考借鑒價值,需要的朋友一起看下吧
    2016-08-08
  • 徹底搞懂?dāng)?shù)據(jù)庫操作truncate delete drop關(guān)鍵詞的區(qū)別

    徹底搞懂?dāng)?shù)據(jù)庫操作truncate delete drop關(guān)鍵詞的區(qū)別

    這篇文章主要為大家介紹了數(shù)據(jù)庫操作truncate delete drop關(guān)鍵詞的區(qū)別,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09

最新評論

随州市| 竹北市| 莎车县| 双江| 清涧县| 塔河县| 大同市| 营口市| 北流市| 布尔津县| 深水埗区| 兰州市| 修武县| 崇信县| 会泽县| 思南县| 昌吉市| 汝南县| 河南省| 金湖县| 仪征市| 仁怀市| 固原市| 招远市| 密云县| 田阳县| 浏阳市| 襄汾县| 揭阳市| 普宁市| 将乐县| 宜城市| 扶风县| 温宿县| 昔阳县| 建阳市| 琼海市| 枣庄市| 德惠市| 浦县| 子长县|