十、mysql数据库中数据表的数据类型——字符串类型

在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,其中:

  1. text:存储文件(二进制数据实际上都是存储路径)
  2. blob:存储二进制数据(通常不用)

4、枚举字符串(enum)

  1. 枚举(enum):事先将所有可能出现的数据都设计好,实际存储时只能存储提前设计好的数据中的一个。
  2. 基本语法:enum(可能出现的元素列表); //如enum('男','女')
    此语句定义好后,相应字段只能存储“男”或者“女”
  3. 实例:
     create table test(
           id int primary key auto_increment,
           sex enum('男','女')
     );
  1. 作用:规范数据格式,节省存储空间(枚举实际存的是数字(即值所对应的序号,如上例中,如果是男,则存"1"),而非字符串),可以将取出的枚举字段的结果加0来判断其存的到底是否为数字;其存的值的序号在枚举列表中从1开始排序,也就是说如果是第一个值,就存一,以此类推。
  2. 原理:枚举在进行数据规范(定义)的时候,系统会自动建立一个数字与枚举元素的对应关系(关系放到日志中),然后再进行数据插入的时候,系统自动将字符转换成对应的数字进行存储,然后在进行数据提取的时候,系统自动将数字转换成对应的字符串显示。
    注: 因为枚举实际存储的是数字,也就是说,如果向表中插入数据时,对应字段也可以直接插入对应值的序号,而不是插入具体的字符串(值)。

5、集合字符串(set)

  1. 集合和枚举不同的地方在于,集合可以一次存储集合元素列表中的多个元素。
  2. 定义集合的基本语法:set(元素列表);
  3. 使用方法:必须使用元素列表中的元素(可以一次使用多个),多个元素之间用“,”分隔
  4. 实例
    create table if not exists stu(
        sno int primary key auto_increment,
        sname varchar(20),
        hobbies set('足球','篮球','羽毛球','跑步');
        )charset utf8;
  1. 原理:集合中存储的也是数值,不过是二进制数,如果选中那个字符串(数值),就将其标志置为1,否则为0;集合中元素的顺序没有关系,最终系统都会去匹配顺序,集合的强大在于能够规范数据和节省空间。

6、mysql中关于数据表中记录的长度的一些规定

  1. mysql中规定,任何一条记录最长不能超过65535个字节(由此易知,varchar永远达不到理论值),而varchar具体能够达到多长和其字符集有关,具体如下:
    1 utf8:varchar 的实际最大长度21844字符;
    2 gbk:varchar 的实际匹配长度32766字符。
  2. 若想用完整个65535个字节,增加一个tinyint字段即可
  3. mysql记录中,若有任何一个字段为空,那么系统会从整个记录中保留一个字节来存储null(若想释放null所占的字节,必须保证所有的字段都不允许为空);
  4. mysql中text文本字符串不占用记录长度,额外存储,但是text文本字符串也是属于记录的一部分,一定需要占据记录中的部分长度(有可能是10个字节,用来保存数据的地址以及长度)。
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值