在SQL中,将字符串总共分为了6类,分别为:(char,varchar,text,blob,enum,set),具体情况如下:
1、定长字符串(char)
定长字符串(char)在定义的时候,就已经确定了该数据在磁盘存储的长度。
char(n):n代表长度length,即字符串的长度,最大长度可以为255,
例如:在utf8编码环境下,存储char(4)这种类型的数据,需要4*3=12个字节的空间。
注: 定长指的是数据的存储长度固定,但是插入的数据的长度并未做要求(mysql(版本8.0以上)中如此)。
2、变长字符串(varchar)
变长字符串在分配空间的时候,按照最大的长度来进行分配,但实际上最终用了多少,是根据具体的数据来确定的。
varchar(n):n表示最大长度,最大为65536个字符,但该类型需要多用1到2个字节存储实际的长度。
例如varchar(10):的确可以最大存储十个汉字(utf8环境),需要10*3+1=31个字节去存储本字符串的实际长度,当最大长度大于255时,就需要2个字节去存储实际长度。
注1: 定长与变长的存储空间的计算(单位:字节,环境:utf8)
char(4)
实际存储的数据 占用字节数
ABCD 4*3=12
A 12
ABCDE 报错,数据长度超出
varchar(4)
实际存储的数据 占用字节数
ABCD 4*3+1=13
A 1*3+1=4
ABCDE 报错,数据长度超出
注2: 如何选择定长和变长字符串(定长和变长字符串的区别):定长的磁盘空间比较浪费,但是效率高,变长的磁盘空间比较节省,但是效率低,所以如果确定数据长度都一样,就使用定长,否则使用变长。
3、文本字符串(text&blob)
如果数据量非常大,通常说超过255个字符就会使用文本字符串,文本字符串根据存储的数据格式,分为text和blob,其中:
- text:存储文件(二进制数据实际上都是存储路径)
- blob:存储二进制数据(通常不用)
4、枚举字符串(enum)
- 枚举(enum):事先将所有可能出现的数据都设计好,实际存储时只能存储提前设计好的数据中的一个。
- 基本语法:
enum(可能出现的元素列表); //如enum('男','女')
此语句定义好后,相应字段只能存储“男”或者“女” - 实例:
create table test(
id int primary key auto_increment,
sex enum('男','女')
);
- 作用:规范数据格式,节省存储空间(枚举实际存的是数字(即值所对应的序号,如上例中,如果是男,则存"1"),而非字符串),可以将取出的枚举字段的结果加0来判断其存的到底是否为数字;其存的值的序号在枚举列表中从1开始排序,也就是说如果是第一个值,就存一,以此类推。
- 原理:枚举在进行数据规范(定义)的时候,系统会自动建立一个数字与枚举元素的对应关系(关系放到日志中),然后再进行数据插入的时候,系统自动将字符转换成对应的数字进行存储,然后在进行数据提取的时候,系统自动将数字转换成对应的字符串显示。
注: 因为枚举实际存储的是数字,也就是说,如果向表中插入数据时,对应字段也可以直接插入对应值的序号,而不是插入具体的字符串(值)。
5、集合字符串(set)
- 集合和枚举不同的地方在于,集合可以一次存储集合元素列表中的多个元素。
- 定义集合的基本语法:
set(元素列表);
- 使用方法:必须使用元素列表中的元素(可以一次使用多个),多个元素之间用“,”分隔
- 实例
create table if not exists stu(
sno int primary key auto_increment,
sname varchar(20),
hobbies set('足球','篮球','羽毛球','跑步');
)charset utf8;
- 原理:集合中存储的也是数值,不过是二进制数,如果选中那个字符串(数值),就将其标志置为1,否则为0;集合中元素的顺序没有关系,最终系统都会去匹配顺序,集合的强大在于能够规范数据和节省空间。
6、mysql中关于数据表中记录的长度的一些规定
- mysql中规定,任何一条记录最长不能超过65535个字节(由此易知,varchar永远达不到理论值),而varchar具体能够达到多长和其字符集有关,具体如下:
1 utf8:varchar 的实际最大长度21844字符;
2 gbk:varchar 的实际匹配长度32766字符。 - 若想用完整个65535个字节,增加一个tinyint字段即可
- mysql记录中,若有任何一个字段为空,那么系统会从整个记录中保留一个字节来存储null(若想释放null所占的字节,必须保证所有的字段都不允许为空);
- mysql中text文本字符串不占用记录长度,额外存储,但是text文本字符串也是属于记录的一部分,一定需要占据记录中的部分长度(有可能是10个字节,用来保存数据的地址以及长度)。