• 梦想还是要有的,万一实现了呢...
  • 区块链论坛整装待发...

Mysql中VARCHAR/CHAR/TEXT数据类型区别不同之处及长度设置方法

MySQL Vetrue 8个月前 (04-30) 270次浏览 0个评论 二维码链接
这篇文章主要介绍了 Mysql 中 VARCHAR/CHAR/TEXT 长度设置方法的相关资料,本文还给大家带来了 valar 类型的变化及 char()和 varchar()的区别介绍,非常不错,具有参考借鉴价值,需要的朋友可以参考下

如果某一项中设置的是 varchar(50)

那么对英文当然是 50

那么对中文呢

utf-8 的中文占 3 个字节

那么,这个 varchar(50)是不是只能存 16 个汉字了?

mysql varchar(50) 不管中文 还是英文 都是存 50 个的

MySQL5 的文档,其中对 varchar 字段类型这样描述:varchar(m) 变长字符串。M 表示最大列长度。M 的范围是 0 到 65,535。(VARCHAR 的最大实际长度由最长的行的大小和使用的字符集确定,最大有效长度是 65,532 字节)。

为何会这般变换?真是感觉 MySQL 的手册做的太不友好了,因为你要仔细的继续往下读才会发现这段描述:MySQL 5.1 遵从标准 SQL 规范,并且不删除 VARCHAR 值的尾部空格。VARCHAR 保存时用一个字节或两个字节长的前缀+数据。如果 VARCHAR 列声明的长度大于 255,长度前缀是两个字节。

好了,貌似懂了一点。但具体他说的长度大于 255 时使用 2 个字节长度前缀,小学减法题:65535 – 2 = 65533 啊。不知道这些大牛如何计算的,暂且保留疑问吧?

注:我测试了一下使用 UTF8 编码,varchar 的最大长度为 21854 字节。

在 mysql 5.0.45 版本,数据库编码 utf8 下进行测试:varchar 最长定义为 21785。也就是说不论字母、数字、汉字,只能放 21785 个。

推想:varchar 字节最大 65535,utf8 编码一个字符 3 个字节 65535/3=21785。

补充知识:

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 语句中的字段,考虑加索引,整形的尤其适合加索引。


Vetrue , 版权所有丨如未注明 , 均为原创丨转载请注明原文链接
原文标题:Mysql 中 VARCHAR/CHAR/TEXT 数据类型区别不同之处及长度设置方法
原文链接:https://vetrue.com/article/269.html
喜欢 (0)
发表我的评论
取消评论
表情 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址