程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL數據類型varchar詳解

MySQL數據類型varchar詳解

編輯:MySQL綜合教程

MySQL數據類型varchar詳解。本站提示廣大學習愛好者:(MySQL數據類型varchar詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL數據類型varchar詳解正文


1、varchar(N)的邏輯意義
從MySQL4.1開端,varchar (N)中的N指的是該字段最多能存儲若干個字符(characters),不是字節數。
不論是一個中英文字符或許數字、或許一個漢字,都當作一個字符。在4.1之前,N表現的是最年夜存儲的字節數(bytes)。
2、varchar(N)究竟能存多長的數據
在mysql reference manual上,varchar最多能存儲65535個字節的數據。varchar 的最年夜長度受限於最年夜行長度(max row size,65535bytes)。65535其實不是一個很准確的下限,可以持續減少這個下限。65535個字節包含一切字段的長度,變長字段的長度標識(每一個變長字段額定應用1或許2個字節記載現實數據長度)、NULL標識位的累計。
NULL標識位,假如varchar字段界說中帶有default null許可列空,則須要須要1bit來標識,每8個bits的標識構成一個字段。一張表中存在N個varchar字段,那末須要(N+7)/8 (取整)bytes存儲一切的NULL標識位。
假如數據表只要一個varchar字段且該字段DEFAULT NULL,那末該varchar字段的最年夜長度為65532個字節,即65535-2-1=65532 bytes。
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;
假如數據表只要一個varchar字段且該字段NOT NULL,那末該varchar字段的最年夜長度為65533個字節,即65535-2=65533bytes。
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;
來個稍微龐雜點的表構造,->
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)字段總共須要變長字段表現字節為1*8=8 bytes。每一個NULL字段用1bit標識,9個字段都是default null,那末須要用(9+7)/8bit = 2 bytes存儲NULL標識位。65535-100*8-1*8-2 = 64725 > 256, 那末字段i的最年夜長度為64725  - 2 =64723 bytes,即N=64723 。
varchar究竟能存若干個字符?這與應用的字符集相干,latin1、gbk、utf8編碼寄存一個字符分離須要占1、2、3個字節。
3、varchar物理存儲
在物理存儲上,varchar應用1到2個額定的字節表現現實存儲的字符串長度(bytes)。假如列的最年夜長度小於256個字節,用一個字節表現(標識)。假如最年夜長度年夜於等於256,應用兩個字節。
被選擇的字符集為latin1,一個字符占用一個byte
varchar(255)存儲一個字符,一共應用2個bytes物理空間存儲數據現實數據長度和數據值。
varchar(256)存儲一個字符,應用2 bytes表現現實數據長度,一共須要3 bytes物理存儲空間。
varchar關於分歧的RDBMS引擎,有欠亨的物理存儲方法,固然有同一的邏輯意義。關於mysql的分歧存儲引擎,其完成辦法與數據的物理寄存方法也分歧。
4、InnoDB中的varchar
InnoDB中varchar的物理存儲方法與InnoDB應用的innodb_file_format有關。晚期的innodb_file_forma應用的Antelope文件格局,支撐redundant和compact兩種row_format。從5.5開端或許InnoDB1.1,可使用一種新的file format,Barracuda。Barracuda兼容Redundant,別的還支撐dynamic和compressed兩種row_format.
當innodb_file_format=Antelope,ROW_FORMAT=REDUNDANT 或許COMPACT。
innodb的集合索引(cluster index)僅僅存儲varchar、text、blob字段的前768個字節,過剩的字節存儲在一個自力的overflow page中,這個列也被稱作off-page。768個字節前綴前面緊隨著20字節指針,指向overflow pages的地位。
別的,在innodb_file_format=Antelope情形下,InnoDB中最多能存儲10個年夜字段(須要應用off-page存儲)。innodbd的默許page size為16KB,InnoDB單行的長度不克不及跨越16k/2=8k個字節,(768+20)*10 < 8k。
當innodb_file_format=Barracuda, ROW_FORMAT=DYNAMIC 或許 COMPRESSED
innodb中一切的varchar、text、blob字段數據能否完整off-page存儲,依據該字段的長度和整行的總長度而定。對off-page存儲的列,cluster index中僅僅存儲20字節的指針,指向現實的overflow page存儲地位。假如單行的長度太年夜而不克不及完整適配cluster index page,innodb將會選擇最長的列作為off-page存儲,直到行的長度可以或許適配cluster index page。
5、MyISAM中的varchar
關於MyISAM引擎,varchar字段一切數據存儲在數據行內(in-line)。myisam表的row_format也影響到varchar的物理存儲行動。
MyISAM的row_format可以經由過程create或許alter sql語句設為fixed和dynamic。別的可以經由過程myisampack生成row_format=compresse的存儲格局。
當myisam表中不存在text或許blob類型的字段,那末可以把row_format設置為fixed(也能夠為dynamic),不然只能為dynamic。
當表中存在varchar字段的時刻,row_format可以設定為fixed或許dynamic。應用row_format=fixed存儲varchar字段數據,糟蹋存儲空間,varchar此時會定長存儲。row_format為fixed和dynamic,varchar的物理完成方法也分歧(可以檢查源代碼文件field.h和field.cc),因此myisam的row_format在fixed和dynamic之間產生轉換的時刻,varchar字段的物理存儲方法也將會產生變更。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved