字符串类型
M表示的字符数,而不是字节数
Gbk 255字节 = 127 字符数
Char (M)(最大255字节):
M表示允许的字符串长度。
规定了一个M长度的字符串。
空间固定为5个字节。
Varchar (M):
M表示允许的最大字符串长度
规定了一个最长为M长度的字符串。
空间为当前字符个数+1。
上两个区别:
Char(5)/Varchar(5)
‘’(空字符串) 5/1 varchar需要一个字节保存字符串的总长度
‘abc’ 5/4
‘abcdf’ 5/6
Char 时间效率高于Varchar (原因:varchar需要计算长度)
Varchar 空间效率高于 Char
注意:
字段的最大长度限制
1.类型本身的限制,例如char最大字节255.
2.记录的总长度也有限制.
真实的varchar 的长度:
总长度65535
面试题目:
当类型数据的字符长度超过255个字符时,采用2个字节来表示长度。
65535-2=65533。
又由于整条记录需要额外的字节用于保存当前字段的null值。
(有一些字段为null值)。
Null 可以使用与所有字段中,因此需要所有字段都为null
才可以省去null的字节。
此外,定义一个字段时,也需要一段字节数。
Text(2^16)(65535可以全部用于保存长度,不用计算字符长度,而且不用定义M):
有很多兄弟类型:
Tinytext Long text;
文本框,用户讨论等。
Enum 枚举类型(多个已知的选项选一个)
65535 2个字节
表面上是字符串,但内部是整型保存。
Set 集合类型(多个已知的选项不定选择几个)
最多占用8个字节;
1字节=8个bit;
最多64个组合类型
create table str_1 /* 查看utf-8最大字符数*/
(
a varchar (65535)
)character set uft-8; /*错误提示最大为21845个字符*/
create table str_1
(
a varchar (21845)
)character set uft-8; /*错误提示,一个记录有最长长度的限制*/
create table str_1
(
a varchar (21844)
)character set uft-8; /*成功*/
create table str_2 /* 查看gbk最大字符数*/
(
a varchar (65535)
)character set gbk; /*错误提示最大为个字符*/
create table str_3
(
a varchar (65533)
)character set latin1; /*错误提示记录太长*/
create table str_3
(
a varchar (65533) not null
)character set latin1; /*成功*/
create table str_4
(
a varchar (65532),
b tinyint /*tinyint 占用一个字节长度*/
); /*错误提示,提示记录太长*/
create table str_4
(
a varchar (65532)not null,
b tinyint
); /*错误提示,提示记录太长*/
create table str_4
(
a varchar (65532) not null,
b tinyint not null
); /*成功*/
create table str_5
(
a text,
b text /*成功,理论上占用空间(2^16+2)*2 但是在定义时没有计算其所占用的空间*/
);
create table str_6
(
gender enum('female','male') /*enum*/
);
insert into str_6 values ('male');
insert into str_6 values ('female');
insert into str_6 values ('other'); /*保存失败,可以+显示内部原因,直到原因后,可以以下操作*/
insert into str_6 values ('2'); /*成功*/
create table str_7 /*set*/
(
hobby set('basketball','football','swim')
);
insert into str_7 values('basketball,football') /*成功,+0 显示 3 内部以位运算保存*/
/*
状态保存机制
basketball:001
football:010
swim:100
*/