MySQl的varchar是以什么做单位的

测试环境出现了一个数据长度过长的bug,原因是测试环境数据的不正确,该字段设置的是varchar(4096)单位,
这时候在内心问了下自己,varchar的单位是字节还是字符?

然后就不知道了。。。。

字节和字符

字节

来自百度百科

字节(Byte )是计算机信息技术用于计量存储容量的一种计量单位,作为一个单位来处理的一个二进制数字串,是构成信息的一个小单位。最常用的字节是八位的字节,即它包含八位的二进制数。

字符

来自百度百科

表示数据和信息的字母、数字或其他符号。在电子计算机中,每一个字符与一个二进制编码相对应。

举例
1
2
3
4
5
6

public static void main(String[] args) {
String str="一二三四五六七八九十一二三四五六七八九十";
System.out.println(str.getBytes().length);//60
System.out.println(str.length());//20
}

可以看到,一二三四五六七八九十一二三四五六七八九十的字符是20个,占用了60字节

验证

创建表
1
2
3
4
5
6
7
8
create table testTable
(
id bigint unsigned auto_increment
comment '主键'
primary key,
extend varchar(20) null
)
comment '测试表';
插入测试数据
1
insert into testTable(extend) values ("一二三四五六七八九十一二三四五六七八九十" );
结果

1 row affected in 44 ms

插入成功,问题的答案是以字符为单位。

文档

官网传送门

MySQL interprets length specifications in character column definitions in character units. This applies to CHAR, VARCHAR, and the TEXT types.

MySQL以字符为单位解释字符列定义中的长度规范。这适用于 CHAR, VARCHAR和 TEXT类型。