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 : 杨以杰
视频中的PPT连接:ptteng.github.io/PPT/PPT-java/Java-task1-varchar.html#/