美文网首页IT修真院_JAVA
varchar类型的长度怎么确定?有什么样的原则,和Text和L

varchar类型的长度怎么确定?有什么样的原则,和Text和L

作者: 紫某某 | 来源:发表于2017-11-22 18:34 被阅读22次

     varchar类型的长度怎么确定?有什么样的原则,和Text和LongText的区别是什么?

    1.知识背景

    什么是VARCHAR、Text、LongText?

    它们都是MySQL数据库的字符串类型,用来存储字符数据。区别是存储的数据长度、大小不一样。我们可以根据需求选择使用哪种字符串类型。

    2.知识剖析

    首先介绍下字节和字符

    字节的定义:字节(byte)是一种计量单位,8个二进制位为一个字节.表示数据量多少,它是计算机信息技术用于计量存储容量的一种计量单位。

    字符的定义:字符是指计算机中使用的文字和符号,如:1、2、3、A、B、C、!、#、¥、.....、+、——等这些符号。

    在UTF8编码中,一个英文字符占用一个字节,一个中文字符占用三个字节。

    VARCHAR是可以保存长度可变的字符串。如:一个用户名字段不能确定长度,只知道不超过10个字符,就可以选择varchar类型。而另一种CHAR类型是只能保存长度固定的字符。如:六位的邮编、股票代码。

    需要注意的是:

    mysql数据库的varcahr类型在4.1以下版本中最大长度限制为255字节

    mysql5.0以上的版本中varchar数据类型的长度支持到了65535字节。

    Text和LongText 也是长度可变的类型

    Text的最大长度是可以存储 65535 (2^16 – 1) 个字符

    LongText的最大长度是可以存储4294967295 (2^32 – 1) 个字符。

    3.常见问题

    1.定义varchar字段时,可不可以短的定义成varchar(20),长的定义成varchar(50),超长另算?

    2.什么时候使用char,varchar,text

    4.解决方案

    1.根据需求与实际情况来考虑,不能千篇一律。 比如:用户名,谁的名字会有255/3=85个字符?所以也没必要那么长,但又不能定义成CHAR(),所以给个够用的长度varchar(20)或更少varchar(10)即可,考虑少数民族可以长点。 varchar的长度,最好是在够用(需要适当预测未来需求)且方便管理的前提下尽可能短。

    2详见:

    http://blog.csdn.net/ww122081351/article/details/18221013

    5.扩展思考

    如果把字符串字段都设置成varchar(255)会怎样?

    1.MySQL建立索引时如果没有限制索引的大小,索引长度会默认采用的该字段的长度,也就是说varchar(20)和varchar(255)对应的索引长度分别为20*3(utf-8)(+2+1),255*3(utf-8)(+2+1),其中"+2"用来存储长度信息,“+1”用来标记是否为空,加载索引信息时用varchar(255)类型会占用更多的内存;(备注:当字段定义为非空的时候,是否为空的标记将不占用字节)

    2.varchar(20)与varchar(255)都是保持可变的字符串,当使用ROW_FORMAT=FIXED(表中不存在可变字段,即静态表)创建MyISAM表时,会为每行使用固定的长度空间,这样设置不同的varchar长度值时,存储相同数据所占用的空间是不一样。通常情况下使用varchar(20)和varchar(255)保持'hello'占用的空间都是一样的,但使用长度较短的列却有巨大的优势。较大的列使用更多的内存,因为MySQL通常会分配固定大小的内存块来保存值,这对排序或使用基于内存的临时表尤其不好。同样的事情也会发生在使用文件排序或者基于磁盘的临时表的时候。

    6.基本数据类型需不需要设置显示长度?int(M)中的M代表什么?

    在int(m)中,这里的M代表的并不是存储在数据库中的具体的长度,当我们在选择使用int类型的时候,不论int(3)、int(4)、int(8) 在磁盘上都是占用 4 btyes 的存储空间。除了显示给用户的方式有点不同外,int(M) 跟 int 数据类型是相同的。

    如果int的值为10

    int(10)显示结果为0000000010

    int(3)显示结果为010

    就是显示的长度不一样而已 都是占用四个字节的空间

    问答环节:

    问题1:MySQL的索引加载是进内存还是在硬盘处理?

    回答:数据都会先进内存.

    问题2:int(M)代表什么?

    int型数据的显示长度并没有什么意义.完全可以不加.

    问题3:一个中文占用几个字节?

    Unicode码表的占用3个字节

    GBK码表的占用2个字节.

    鸣谢

    感谢观看,如有出错,恳请指正

    BY : 杨以杰


    undefined_腾讯视频

    视频中的PPT连接:ptteng.github.io/PPT/PPT-java/Java-task1-varchar.html#/

    相关文章

      网友评论

        本文标题:varchar类型的长度怎么确定?有什么样的原则,和Text和L

        本文链接:https://www.haomeiwen.com/subject/mxyovxtx.html