字符串的字符数的含义

字符串的字符数的含义

  • 一个英文字母的字符数为1
  • 一个中文汉字的字符数也为1
  • 一个数字的字符数也为1

例如:字符串类型 CHAR(n) 和 VARCHAR(n)

常用的字符串类型的数据类型有 CHAR 和 VARCHAR 两种,两者后面都需要跟上一个数字表示长度,例如

CHAR(10)
VARCHAR(10)
CHAR(n) 和 VARCHAR(n) 两者中的 n 含义均为该字段最大可容纳的字符数。(注意早期的版本中,n指的是字节数,你也不需要关注是哪些版本,因为是十多年前的版本了,估计一般人也用不到)。
占用空间
CHAR(n) 和 VARCHAR(n) 字段值的占用空间不是固定的,而是由实际存入的内容决定的,但在细节上两者有一些不同。我们均以 n=4 为例。

CHAR类型

对于 CHAR(4) 表示固定容纳4个字符,当少于4个字符时,会使用空格填充空缺的部分,使其达到4个字符。如果超过4个字符,会自动截断超出部分。例如你存入数据为 ‘ab’ ,实际会存入 'ab ’ (ab后有2个空格),因此占用4个字节。以下以几个案例作为演示:
(1) ‘a啊b’ —— 字符数为3,少1个用空格补齐,因此实际存入 'a啊b ’ ,字符数:4,字节数:1+3+1+1=6
(2)‘a啊b哈ccccccccc’ —— 字符数超出4,仅保留前4个字符,因此实际存入 ‘a啊b哈’ ,字符数:4,字节数:1+3+1+3=8
(3)‘a啊和哈’ —— 字符数刚好为4,不需要截断和补齐,因此实际存入 ‘a啊和哈’ ,字符数:4,字节数:1+3+3+3=10

对于 CHAR 字段,你在使用 CHAR_LENGTH() 和 LENGTH() 函数查询时,会发现和以上描述的情况不一致,我们放上代码演示:
(备注: CHAR_LENGTH() 函数返回字符串的字符数, LENGTH() 函数返回字符串的字节数)
– 假定已存在表 tb ,其中包含字段 s_char 的数据类型定义为 CHAR(4) ,我们先进行插入操作,获取插入行id=1
INSERT INTO tb(s_char) VALUES (‘啊a’); – 接下去查询该行 SELECT s_char, CHAR_LENGTH(s_char), LENGTH(s_char) FROM tb WHERE id=1;
– 结果为:s_char=>‘啊a’,CHAR_LENGTH(s_char)=>2,LENGTH(s_char)=>4
你会发现以上结果跟预想中的不一致,按照一般理解预期存入 ‘啊a’ ,仅为2个字符,需补充2个空格,实际存入为 '啊a ’ ,因此字符数为4,字节数为 3+1+1+1=6 。
这里造成偏差的原因并不是错误,而是 CHAR 字段在检索输出时,自动省略了右侧的空格。我们来演示一遍完整的流程:
预期存入 ‘啊a’ ,少于4个字符,补充2个空格,因此实际存入的值为 '啊a ’ ,该值字符数为4,字节数为6。在检索时,原值为 '啊a ’ ,输出时自动省略右侧空格,实际输出为 ‘啊a’ ,该字符串字符数为2,字节数为4。

VARCHAR 类型

下面再来说说 VARCHAR 类型,依然以 n=4 为例。区别于 CHAR 类型的补空, VARCHAR 类型对于未达到 n 字符的情况不会补空。
关于计算 VARCHAR 类型字符串的占用空间,有一点需要说明的是, VARCHAR 类型字符串的占用空间实际上包含2部分,一是存储数据本身占用的空间,二是描述数据的元数据占用的空间,例如 VARCHAR 类型会使用1个字节记录存入数据实际的字符数。下述描述的“占用空间”特指前者,即存储数据本身占用的空间,不包含描述数据的元数据占用的空间。(其他数据类型等同)
以下以几个案例作为演示:
(1) ‘a啊b’ —— 字符数为3,不补空,实际存入为 ‘a啊b’ ,字符数为3,字节数为 1+3+1=5 。
(2)‘a啊b哈ccccccccc’ —— 字符数超出4,仅保留前4个字符,因此实际存入 ‘a啊b哈’ ,字符数:4,字节数:1+3+1+3=8 。这种情况和 CHAR 类型处理一致。
(3)‘a啊和哈’ —— 字符数刚好为4,不需要截断和补齐,因此实际存入 ‘a啊和哈’ ,字符数:4,字节数:1+3+3+3=10

转发自:一文搞懂MySQL的数据类型中长度的含义

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值