MySQL数据类型varchar详解_MySQL
bitsCN.com
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 当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字段的物理存储方式也将会发生变化。
bitsCN.com

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

一個漢字的機內碼需要2個位元組儲存。在國內流行的漢字系統中,一個漢字的機內碼佔2個字節,因為漢字處理系統要確保中西文的兼容,當系統中同時存在ASCII碼和漢字國標碼時,將會產生二義性;為此,漢字機內碼應對國標碼加以適當處理和變換。

PHP是一種廣泛使用的伺服器端腳本語言,常用於網站開發。在網站開發過程中,經常會遇到對漢字進行轉碼的需求,特別是在處理中文字元時。掌握PHP處理漢字轉碼的技巧,能有效避免亂碼等問題,提升網站的穩定性與使用者體驗。 1.utf8_encode和utf8_decode函數在PHP中,可以使用utf8_encode和utf8_decode函數進行漢字的編碼和解碼操

漢字轉UTF-8編碼的原理實際上涉及到字符編碼的概念。在電腦中,文字字元需要以數字的形式進行表示和存儲,而不同的字元編碼方案規定了不同字元到數字之間的對應關係。 UTF-8是一種常用的字符編碼方式,它支援全球範圍內的字符,並且採用可變長度的編碼方式,能夠有效地表示各種語言的字符,特別適用於Unicode字符集。 PHP作為一種常見的伺服器端腳本語言,也提供了對

我們在安裝win11系統之後,首先必須要安裝win11中文輸入法才能打出漢字,如果在安裝中文輸入法之後,還是無法打出漢字,那麼可能是相關服務被禁用了,將它重啟即可,下面就一起來看一下吧。 win11打不出漢字怎麼辦:1.首先我們要確保自己已經下載安裝了中文輸入法,或是第三方輸入法軟體。 2.如果大家不知道如何加入輸入法的話,可以查看本站的教學。 3.如果新增完輸入法,還是無法打漢字,那就需要開啟相關服務了。 4.先右鍵開始選單,找到其中的「電腦管理」5、然後依序進入「任務計畫程式」-「任務計畫程序

漢字在電腦中是以字形碼形式輸出的,字形碼是點陣代碼的一種,為了將漢字在顯示器或印表機上輸出,把漢字按圖形符號設計成點陣圖,就得到了相應的點陣代碼。

PHP正規表示式指南:符合漢字的方法正規表示式在文字處理中起到非常重要的作用,它能夠幫助我們快速且準確地匹配特定模式的文字內容。而對於中文文本的處理,特別是匹配漢字這個特殊需求,正規表示式同樣可以派上用場。本文將介紹在PHP中如何使用正規表示式來匹配漢字,同時提供具體的程式碼範例。首先,我們要先明確漢字在Unicode編碼中的範圍。漢字的Unicode編碼範圍大

避免PHP輸出漢字亂碼的技巧在進行PHP程式設計時,常會遇到輸出中文內容的狀況。但是如果不小心處理不當,就容易出現中文亂碼的狀況,影響使用者體驗。因此,掌握一些技巧可以有效地避免PHP輸出漢字亂碼。以下將介紹一些具體的程式碼範例,幫助開發者們更好地處理中文字元輸出。 1.設定字元編碼為UTF-8確保PHP檔案本身的編碼為UTF-8,可以在程式碼開頭加上以下註解來指定

電腦中漢字使用機內碼進行存儲,漢字機內碼指電腦內部存儲,處理加工和傳輸漢字時所用的由0和1符號組成的代碼,機內碼是漢字最基本的編碼,不管是什麼漢字系統和漢字輸入方法,輸入的漢字外碼到機器內部都要轉換成機內碼,才能被儲存和進行各種處理。
