下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

数据类型当中的字符型

作者:课课家教育     来源: http://www.kokojia.com点击数:1102发布时间: 2016-12-21 08:18:37

标签: mysqlmysql教程mysql数据库

  字符串是最基本的类型之一,能够表示任何一种值。我们能够用字符串类型存储图象或者是声音之类的二进制数据,也能够储存用gzip压缩的数据。今天小编主要介绍两种常见字符类型:char以及varchar,并且会给大家详细解释不同编码当中的varchar的储存大小对MySQL数据表一条记录各字段的影响。

  (一)MySQL当中char与varchar的区别

  (1)关于char以及varchar储存字符数:

  char以及varchar都可以储存字符串,它们的声明语法为char(N),其中,N表示可以储存的字符长度,要是utf8编码储存了N个汉字,而每个汉字占用3字节,这样的话char占用的字节数为N*3。

  char为定长类型,最大储存字符数为255个,就是说char(255);

      varchar为可变长类型,它的最大可储存的字符数为变量。

数据类型当中的字符型_mysql_mysql教程_mysql数据库_课课家

  MySQL4.0以前的版本中N指的是占用字节数,而MySQL5.0以后把它定义为字符数。

  (2)char与varchar的储存方式:

  如:char(10)以及varchar(10)

  char(10)中,不管有没有存10个字符的长度,数据库都会划分10个字符长度来储存数据,要是没储存10个字符长度,数据库会在字符串末尾补上"空格符"填充到10个字符长度,查询的时候以10字符为单位取出数据,然后把末尾空格符去除。

  然而varchar(10)当中,要是储存了"abc",数据库就会在每一个varchar字符数据前面插入该字符长度的标识,而这些标识占用一到两个字节,在varchar储存的字符数小于255的侯,标识符就会占用1个字节,而在大于255个字符时就占用2个字节,如:“abc”长度为3,我们就在长度标识中插入一个字节,并储存长度3,mysql查询到长度标识字节的时侯,该varchar类型占用3个字符长度,向后取3个字符就结束。

  在储存的字符数不多时,如:10个,我们就可以用char,固定长度的存取效率就会更高,要是储存字符数偏多,即大于20或上百时,就可以用varchar或text类型。

  (3)char和varchar建表,实例:

char和varchar建表

  (4)char和varchar储存数据的不同点

  在储存的字符没有达到声明的字符数的时侯,char就会在末尾补空格来进行储存,取出时会把末尾空格全去除,如下;

char和varchar储存数据的不同点

  注意:字符以及字节的关系会根据使用的编码变化;UTF8编码中中文一个字符占用3个字节,而英文和数字一个字符占用一个字节;GBK编码中,中文一个字符占用2个字节,英文以及数字每个字符都只占用一个字节。

  (二)MySQL中varchar字符的最大储存长度与列数目的关系

  varchar为变长类型,数据库不能了解某一个字段中储存了多长的varchar数据,就要在储存的数据前就插入字符长度标识;

  在储存的字符小于255的时侯就插入1个字节,大于255时就插入2个字节,原因是一个字节最大可以储存255个无符号整数;

  以上不难推出,理论上varchar能够索引的最大字符数为2^16-1=65536-1=65535,而事实上varchar不可以储存这么多字符数,MySQL5.0以后的版本就规定在MySQL中表的一条记录的长度,不可以超过65535字节;

  要是用utf8编码,在一张表中创建长度为char(255)的列,就是说允许输入255个字符,要是储存的都是汉字,我们知道每个汉字在utf8中占用3字节,而且这张表只创建这种类型的列,所以一共可以创建的这种列个数为:65535/(255*3)=85(列)

  原因是一条记录只可以储存65535个字节,而一条记录中每个字段允许255个字符,就是说每个字段占用的空间为255*3字节,然后用总字节长度除以每个字段占用的字节长度,就能得到结果。

  在了解记录的长度限制后,再假设一张表中只存在一列,请看以下语句:

假设一张表中只存在一列

  那么,要是字符串储存都为汉字,N可以填写的最大值为多少呢?

  我们上面就提到,理论可以索引的最大值是65535,但是如果我们N=65535,肯定会报错,当储存字符大于255的时候,varchar列前面需要插入2字节长度标识。此外,MySQL官方规定,varchar最前端还有1字节保留空间,判断这个字段是否为NULL,就是说实际储存数据从第4个字节开始,而utf8用3字节储存汉字,所以结果为((65535-1-2)/3=21844),验证如下:

验证

  下面也是插入一条记录,会有什么问题呢:

插入一条记录

  那么要是字符串储存的都是汉字,N最大可以填写的值是多少?

  (65535-4-60*3-1-2)/3=21782.666…

  首先,int列占用4字节,char列占用180字节,然后减去NULL1字节的判断,2字节长度标识,再把剩下的字节数除以3,就可以得到能够储存的最大字符数;

  要是N可以填写的最大值就是21782,超过此临界值2个字符,就会被强制转换成text类型储存,如下:

 被强制转换成text类型储存

  总结:相信大家看完这篇文章,都会对MySQL当中一条记录可以创建的列数有了一个全新的认识,我们就会知道,能够创建的列的数量并不是一个固定值,而是由此条记录当中全部数据类型占用的字节数决定的。

赞(0)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程