search
HomeDatabaseMysql TutorialMySQL数据类型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

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
一个汉字的机内码需要几个字节储存一个汉字的机内码需要几个字节储存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编码范围大

计算机中汉字使用什么进行存储?计算机中汉字使用什么进行存储?Dec 07, 2020 am 10:17 AM

计算机中汉字使用机内码进行存储,汉字机内码指计算机内部存储,处理加工和传输汉字时所用的由0和1符号组成的代码,机内码是汉字最基本的编码,不管是什么汉字系统和汉字输入方法,输入的汉字外码到机器内部都要转换成机内码,才能被存储和进行各种处理。

避免PHP输出汉字乱码的技巧避免PHP输出汉字乱码的技巧Mar 16, 2024 am 10:21 AM

避免PHP输出汉字乱码的技巧在进行PHP编程时,经常会遇到输出中文内容的情况。但是如果不小心处理不当,就容易出现中文乱码的情况,影响用户体验。因此,掌握一些技巧可以有效地避免PHP输出汉字乱码。下面将介绍一些具体的代码示例,帮助开发者们更好地处理中文字符输出。1.设置字符编码为UTF-8确保PHP文件本身的编码为UTF-8,可以在代码开头添加如下注释来指定

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Tools

mPDF

mPDF

mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

SublimeText3 Linux new version

SublimeText3 Linux new version

SublimeText3 Linux latest version

SublimeText3 English version

SublimeText3 English version

Recommended: Win version, supports code prompts!