MySql中的字符类型---varchar类型

深入理解MySQL中VARCHAR与TEXT类型的应用
本文详细解析了MySQL数据库中VARCHAR和TEXT类型的特性、区别及应用场景,包括长度限制、编码规则、效率对比等关键信息,帮助开发者合理选择数据类型以优化数据库性能。

1.varchar类型的变化

MySQL 数据库的varchar类型在4.1以下的版本中的最大长度限制为255,其数据范围可以是0~255或1~255(根据不同版本数据库来定)。在 MySQL5.0以上的版本中,varchar数据类型的长度支持到了65535,也就是说可以存放65532个字节的数据,起始位和结束位占去了3个字 节,也就是说,在4.1或以下版本中需要使用固定的TEXT或BLOB格式存放的数据可以使用可变长的varchar来存放,这样就能有效的减少数据库文 件的大小。

MySQL 数据库的varchar类型在4.1以下的版本中,nvarchar(存储的是Unicode数据类型的字符)不管是一个字符还是一个汉字,都存为2个字节 ,一般用作中文或者其他语言输入,这样不容易乱码 ;varchar: 汉字是2个字节,其他字符存为1个字节 ,varchar适合输入英文和数字。

4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) ;5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65532字节 ;varchar(20)在Mysql4中最大也不过是20个字节,但是Mysql5根据编码不同,存储大小也不同,具体有以下规则:

a) 存储限制

varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535。

b) 编码长度限制

字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766;

字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。

若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。

c) 行长度限制

导致实际应用中varchar长度限制的是一个行定义的长度。 MySQL要求一个行的定义长度不能超过65535。若定义的表长度超过这个值,则提示

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs。

2.CHAR(M), VARCHAR(M)不同之处

CHAR(M)定义的列的长度为固定的,M取值可以为0~255之间,当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充。

VARCHAR(M)定义的列的长度为可变长字符串,M取值可以为0~65535之间,(VARCHAR的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是65,532字节)。VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节)。VARCHAR值保存时不进行填充。当值保存和检索时尾部的空格仍保留,符合标准SQL。varchar存储变长数据,但存储效率没有CHAR高。如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为什么"+1"呢?这一个字节用于保存实际使用了多大的长度。从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。

CHAR和VARCHAR最大的不同就是一个是固定长度,一个是可变长度。由于是可变长度,因此实际存储的时候是实际字符串再加上一个记录字符串长度的字节(如果超过255则需要两个字节)。如果分配给CHAR或VARCHAR列的值超过列的最大长度,则对值进行裁剪以使其适合。如果被裁掉的字符不是空格,则会产生一条警告。如果裁剪非空格字符,则会造成错误(而不是警告)并通过使用严格SQL模式禁用值的插入。

3. VARCHAR和TEXT、BlOB类型的区别

VARCHAR,BLOB和TEXT类型是变长类型,对于其存储需求取决于列值的实际长度(在前面的表格中用L表示),而不是取决于类型的最大可能尺寸。例如,一个VARCHAR(10)列能保存最大长度为10个字符的一个字符串,实际的存储需要是字符串的长度 ,加上1个字节以记录字符串的长度。对于字符串'abcd',L是4而存储要求是5个字节。

BLOB和TEXT类型需要1,2,3或4个字节来记录列值的长度,这取决于类型的最大可能长度。VARCHAR需要定义大小,有65535字节的最大限制;TEXT则不需要。如果你把一个超过列类型最大长度的值赋给一个BLOB或TEXT列,值被截断以适合它。

一个BLOB是一个能保存可变数量的数据的二进制的大对象。4个BLOB类型TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB仅仅在他们能保存值的最大长度方面有所不同。

BLOB 可以储存图片,TEXT不行,TEXT只能储存纯文本文件。4个TEXT类型TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT对应于4个BLOB类型,并且有同样的最大长度和存储需求。在BLOB和TEXT类型之间的唯一差别是对BLOB值的排序和比较以大小写敏感方式执行,而对TEXT值是大小写不敏感的。换句话说,一个TEXT是一个大小写不敏感的BLOB。

4.总结char,varchar,text区别

长度的区别,char范围是0~255,varchar最长是64k,但是注意这里的64k是整个row的长度,要考虑到其它的column,还有如果存在not null的时候也会占用一位,对不同的字符集,有效长度还不一样,比如utf8的,最多21845,还要除去别的column,但是varchar在一般情况下存储都够用了。如果遇到了大文本,考虑使用text,最大能到4G。

效率来说基本是char>varchar>text,但是如果使用的是Innodb引擎的话,推荐使用varchar代替char

char和varchar可以有默认值,text不能指定默认值

数据库选择合适的数据类型存储还是很有必要的,对性能有一定影响。这里在零碎记录两笔,对于int类型的,如果不需要存取负值,最好加上unsigned;对于经常出现在where语句中的字段,考虑加索引,整形的尤其适合加索引。

<think>首先,用户的问题是:“我想了解MySQLVARCHAR类型是基于字符长度还是字节长度进行存储 请问MySQL VARCHAR类型是按字符长度还是字节长度定义”。这是一个关于MySQL数据库的VARCHAR类型定义的问题。 我需要参考提供的引用内容来回答这个问题。引用内容如下: - 引用[1]:在MySQL 5.X以上的版本中,VARCHAR(20)表示字符长度,可以存储20个英文字符或20个中文字符。在MySQL 4.X版本中,表示字节长度。 - 引用[2]:VARCHAR类型存储变长字段的字符类型,存储时需要前缀长度列表。如果字符串长度小于255字节,需要1字节空间;如果大于255字节,需要2字节空间。 - 引用[3]:在MySQL 5.0以上版本,VARCHAR的最大长度是65535字节,但受限于最大行长度。65535字节包括所有字段的长度、变长字段的长度标识和NULL标志位。 - 引用[4]:在UTF8MB4字符集下,一个中文汉字占3个字节。例如,VARCHAR(60)存储“万科”,实际长度是6字节。 - 引用[5]:在Oracle中,可以用字符为单位定义VARCHAR2字段,但MySQL类似。 从这些引用中,我可以总结出: -MySQL中,VARCHAR类型定义的长度指的是字符长度,而不是字节长度。具体来说: - MySQL 5.X及以上版本:VARCHAR(n) 中的n表示最大字符数。 - MySQL 4.X版本:表示字节长度。 - 实际存储时,VARCHAR是变长的,存储的字节数取决于字符集和实际内容。例如,在UTF8MB4字符集下,一个中文字符占用3个字节,所以VARCHAR(10)可以存储10个字符,但每个字符可能占用多个字节。 用户的问题直接问“是按字符长度还是字节长度定义”,所以我需要明确回答:在MySQL中,VARCHAR类型定义的长度是基于字符长度的(在MySQL 5.X及以上版本)。 现在,回答结构需要清晰,帮助用户逐步解决问题。系统指令要求: - 回答结构清晰。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,如[^1]。 - 所有行内数学表达式用$...$,独立公式用$$...$$,但这个问题可能不需要数学表达式,除非涉及计算。 - 保证回答真实可靠。 所以,回答结构: 1. **直接回答问题**:明确说明VARCHAR类型定义的长度是字符长度(在MySQL 5.X及以上)。 2. **解释细节**:描述不同MySQL版本的区别,以及存储机制。 3. **引用支持**:在解释时,引用提供的引用内容。 4. **生成相关问题**:在最后,添加相关问题部分。 最后,添加相关问题。系统指令说“生成相关问题”,并给出示例格式。 相关问题应该基于用户的问题,比如: - VARCHAR的最大长度限制是什么? - 不同字符集如何影响VARCHAR存储? - 如何计算VARCHAR字段的实际存储大小? - MySQL 4.X和5.X的差异? 从引用中,我可以提取一些点。 完整回答结构: - 开头:直接回答。 - 主体:详细解释,分步说明。 - 结尾:相关问题。 添加引用标识:例如,在提到MySQL 5.X时,加[^1]。 现在,草拟回答: 回答: 在MySQL中,VARCHAR类型定义的长度是基于字符长度的,而不是字节长度。具体来说: -MySQL 5.X及以上版本中,VARCHAR(n) 中的n表示最大字符数。例如,VARCHAR(10)可以存储最多10个字符,无论这些字符是英文还是中文[^1]。 -MySQL 4.X版本中,VARCHAR(n) 表示字节长度,存储时会根据字符集计算字节数[^1]。 实际存储时,VARCHAR是变长字符串类型。存储的字节数取决于字符集和实际内容。例如: - 在UTF8MB4字符集下,一个中文字符通常占用3个字节[^4]。 - 存储机制包括前缀长度标识:如果字符串长度小于255字节,需要1字节的前缀;如果大于255字节,需要2字节的前缀[^2]。 此外,VARCHAR的最大长度受限于最大行长度(65535字节),但实际可定义的长度会因字符集和行中其他字段而不同[^3]。 总之,在大多数现代MySQL版本(5.X及以上),VARCHAR(n) 定义的是字符长度,确保存储时能容纳n个字符。 相关问题: 1. 在MySQL中,如何计算VARCHAR字段的实际存储大小? 2. VARCHAR和CHAR类型在存储上有什么区别? 3. 不同字符集(如UTF8MB4 vs LATIN1)如何影响VARCHAR的存储空间? 4. 在MySQL 4.X版本中,VARCHAR的定义方式有什么不同? 确保引用正确: - 对于MySQL 5.X版本字符长度:[^1] - 对于存储机制:[^2]和[^3] - 对于字符集影响:[^4] 在回答中自然添加引用。</think>### MySQLVARCHAR类型定义的长度解析 在MySQL中,VARCHAR类型定义的长度**基于字符长度(character length)**,而非字节长度(byte length)。以下是详细解释,帮助您逐步理解: 1. **MySQL版本差异**: - **MySQL 5.X及以上版本**:VARCHAR(n) 中的 `n` 表示最大字符数(character count)。例如,`VARCHAR(10)` 可以存储最多10个英文字符或10个中文字符(无论字符占用多少字节),定义时以字符为单位[^1]。 - **MySQL 4.X版本**:VARCHAR(n) 中的 `n` 表示字节长度(byte length),存储时会根据字符集动态计算字节数[^1]。但由于MySQL 4.X已过时,现代应用通常使用5.X及以上版本,因此字符长度是主流定义方式。 2. **存储机制**: - VARCHAR是变长字符串类型,实际存储的字节数取决于字符集(character set)和具体内容。例如: - 在UTF8MB4字符集下,一个英文字符占用1字节,一个中文字符占用3字节[^4]。 - 存储时需添加前缀长度标识:如果字符串长度小于255字节,前缀占用1字节;如果大于255字节,前缀占用2字节[^2]。 例如,定义 `VARCHAR(60)` 并存储 "万科"(2个中文字符),在UTF8MB4下实际字节长度为6字节(2字符 × 3字节/字符),但定义的长度60表示最多可容纳60个字符[^4]。 3. **最大长度限制**: - VARCHAR的最大理论长度为65535字节(包括所有字段长度、变长字段标识和NULL标志位),但实际可定义的最大字符数受字符集影响。例如: - 在LATIN1字符集(单字节字符)下,`VARCHAR(65535)` 可能有效。 - 在UTF8MB4字符集(多字节字符)下,最大字符数约为65535/3 ≈ 21845字符(需考虑行大小限制)[^3]。 实际使用中,需通过 `SHOW TABLE STATUS` 或计算行大小来验证。 4. **与字节长度的关系**: - 虽然定义基于字符长度,但实际存储占用字节数需通过函数如 `LENGTH()`(字节长度)和 `CHAR_LENGTH()`(字符长度)计算。例如: ```sql SELECT name, CHAR_LENGTH(name) AS char_len, LENGTH(name) AS byte_len FROM users; ``` 在UTF8MB4下,若 `name VARCHAR(10)` 存储 "Hello"(5字符),则 `char_len=5`,`byte_len=5`;若存储 "你好"(2字符),则 `byte_len=6`[^4]。 **总结**:在MySQL 5.X及以上版本中,VARCHAR(n) 的 `n` 明确表示字符长度,确保用户定义时无需考虑字节转换。存储引擎会根据字符集自动处理字节级细节,但需注意字符集选择对实际存储空间的影响(如UTF8MB4比LATIN1占用更多字节)[^1][^2][^3][^4]。 ### 相关问题 1. 如何计算MySQLVARCHAR字段的实际存储大小(包括前缀和字符集影响)? 2. VARCHAR和CHAR类型在存储机制和性能上有何区别? 3. 不同字符集(如UTF8MB4、LATIN1)如何影响VARCHAR的最大可定义长度? 4. 在MySQL中,如何优化VARCHAR字段以减少存储空间占用?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值