MySQL——varchar和char的区别

导读:本篇文章讲解 MySQL——varchar和char的区别,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

MySQL8 默认的字符编码和排序方式为 utf8mb4utf8mb4_0900_ai_ci

阿里手册描述:

在这里插入图片描述

CHAR 和 VARCHAR类型的区别

  • VARCHAR(N),最多存储N个字符,有几个字符存储几个

存储字节数 = 数据值的字节 + 长度标识 + NULL标识

  • CHAR(N),最多存储N个字符,不足4个,尾部用空格填满

存储字节数 = 数据值的字节和 + 补位空格数

注意:VARCHAR和CHAR都是MySQL的字符串类型,存储多个字符、可设置最大存储的字符数,存储开销都与数据长度、字符集有关

CHAR和VARCHAR具体对比:

特性 CHAR VARCHAR
长度 定长,固定字符数
最大255个字符
数据长度不足声明值时,在尾部自动填充空格
长度可变,可设置最大存储字符数
最大不超过行大小(默认65535字节=2^16-1字节)
前缀 1~2字节,看列长度是否可能超过255字节
比如VARCHAR(100),字符集为UTF8,则字节最大可能为300字节,所以会使用2个字节标识长度
有否尾部空格 长度不足默认用空格填满
检索和获取时会自动去除
不会自动填充空格输入值就包含空格,则会存储,检索和获取数据都会体现
超长处理 超长部分如果是空格自动截断
如果是字符,严格模式下会报错
超长部分如果是空格自动截断,并生成警告
如果是字符,严格模式下会报错
存储开销 数据值的字节和 + 补位空格数 数据值的字节和 + 长度标识字节数

单字符最大字节数

MySQL常见的四个字符集:

  • latin1: 单字符最大占 1个字节
  • gbk:单字符最大可占用 2个字节
  • utf8:单字符最大可占用 3个字节
  • uth8mb4:单字符最大占 4个字节

例如:
有6字节可以存放字符,按单字符占用最大字节数来算,可以存放6个latin1,3个GBK、2个UTF8、1个UTF8MB4。

注意:在utf8mb4下,英文占用1个字节,汉字占3个字节,emoji表情占4个字节。应当与varchar的字符数概念区分开。

# 计算字段所占的字节数
select length(字段) from 表

MySQL的行大小的限制

VARCHARCHAR 的最大值受MySQL表的内部表示的65535字节的最大行大小限制,查看如下:

mysql> show global variables like '%innodb_page_size%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| innodb_page_size | 16384 |
+------------------+-------+
1 row in set (0.00 sec)

注意:BLOBTEXT,INT,FLOAT,DATETIME 不受此大小约束。

MySQL建表时,列长度有65535的限制,数据库采用的默认字符集为 utf8mb4 ,最多用 4个字节存储,那么总的字符长度为 65535/4=16383.75,既,最多存储 16383 个字符。

例如:

create table tmp_t8(c0 varchar(16380),c1 char(4),c2 int,c3 BLOB)
> 1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

由于 16380 + 4 > 16383(mysql最大行限制),所以无法报错。

除非:

create table tmp_t9(c0 varchar(16380),c1 char(3))
> OK

VARCHAR的长度计算

MySQL中字段声明的长度,大部分指的是字符数,比如varchar(15)bigint(18)decimal(8,4)等。而计算存储开销时,需要换算成字节(Byte)和位(Bit)

在常用的COMPACTDYNAMIC行模式下,最大长度受几个因素影响:

  1. 行存储的最大字节数
  2. 数据之外的存储开销,官方定义中包括:NULL标识、长度标识
  3. 存储字符的字符集

算法如下:

最大长度(字符数) = (行存储最大字节数 – NULL标识列占用字节数 – 长度标识字节数) / 字符集单字符最大字节数。有余数时向下取整。

长度标识

长度标识位表示的是VARCHAR存储的字节数。小于255用1字节标识,大于等于255用2字节标识。

可空列标识位

  • 如果有一个列允许为空,则需要1 byte来标识。

验证:

我们知道最大可创建65533字节长度的非空VARCHAR列。现在要创建一个可空列,每列需要1 byte的NULL标识位,那么我们应该可创建最大为65533(最大非空VARCHAR列) – (NULL标识列)= 可空VARCHAR列:

注意: 这里使用默认字符集latin1、单字节字符集

/* 测试边界值65529,刚好创建失败*/
CREATE TABLE test_varchar_length(v1 varchar(65529),v2 varchar(1),v3 varchar(1))DEFAULT CHARSET=latin1
> 1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

/* 测试边界值65528,刚好创建成功,说明可空标识列确实占去了1字节; */
CREATE TABLE test_varchar_length(v1 varchar(65528),v2 varchar(1),v3 varchar(1))DEFAULT CHARSET=latin1;

附录

mysql8——8.4.7 表列数和行大小的限制

mysql8——11.3.2 CHAR和VARCHAR类型

MySQL中VARCHAR最大长度是多少?CHAR和VARCHAR有哪些区别?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/69702.html

(0)

相关推荐

半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!