首頁 資料庫 mysql教程 MySQL数据类型varchar详解_MySQL

MySQL数据类型varchar详解_MySQL

Jun 01, 2016 pm 01:18 PM
漢字

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

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

一個漢字的機內碼需要幾個位元組儲存 一個漢字的機內碼需要幾個位元組儲存 Dec 14, 2020 pm 05:45 PM

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

掌握 PHP 處理漢字轉碼的技巧 掌握 PHP 處理漢字轉碼的技巧 Mar 28, 2024 pm 03:47 PM

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

深入了解PHP中漢字轉UTF-8編碼的原理 深入了解PHP中漢字轉UTF-8編碼的原理 Mar 28, 2024 pm 02:44 PM

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

win11漢字輸入問題解決方法 win11漢字輸入問題解決方法 Jan 05, 2024 am 08:29 AM

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

漢字在計算機中是以什麼形式輸出的 漢字在計算機中是以什麼形式輸出的 Dec 07, 2020 am 11:15 AM

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

PHP正規表示式指南:符合漢字的方法 PHP正規表示式指南:符合漢字的方法 Mar 20, 2024 pm 05:27 PM

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

避免PHP輸出漢字亂碼的技巧 避免PHP輸出漢字亂碼的技巧 Mar 16, 2024 am 10:21 AM

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

計算機中漢字使用什麼進行儲存? 計算機中漢字使用什麼進行儲存? Dec 07, 2020 am 10:17 AM

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

See all articles