发表于: 2018-03-31 01:58:30

1 518


今天完成的事情:

今天临时有事,没能完成昨天的计划。

所以只是搜索了一下关于数据类型选择和区分的内容结合师兄的日报提到的内容,然后其内容记录下个人理解,不是很确定是否正确(之后一边做任务一边验证一下)。

一.

mysql数据库中以 :数据类型(m)  来约束数据,其中 数字m在不同的数据类型中表示含义是不同的。

1.

整型类型

TINYINT(size)  2^8字节

SMALLINT(size) 2^16

MEDIUMINT(size) 2^24

INT(size) 2^32

BIGINT(size)  2^64

UNSIGNED:可定义为无符号类型

整型数系统已经限制了取值范围

所以整型数后面的m不是表示的数据长度,而是表示数据在显示时显示的最小长度

总结:int(11)tinyint(1)bigint(20),后面的数字,不代表占用空间容量。而代表最小显示位数。这个东西基本没有意义,除非你对字段指定zerofill

建表时,mysql会自动分配长度:int(11)tinyint(4)smallint(6)mediumint(9)bigint(20)

对于int类型的,如果不需要存取负值,最好加上unsigned;对于经常出现在where语句中的字段,考虑加索引,整形的尤其适合加索引。


整形的个人理解:1.整形后面的参数只是改变显示效果,没有设置字节的作用;2.当一个字段被定义为整形时系统会根据其类型选择分配长度;3.选择整型数据时,在可允许的范围内选择占字节最小的。


字符串类型

char(M)  2^8字节

varchar(M)  2^16

tinytext   2^8

text  2^16

 mediumtext 2^24

longtext  2^32

enum  

set  

1.varchar类型的变化

 

MySQL 中的 VARCHAR(255) 可以存放 1 - 255 UTF-8 格式的汉字 ...

latin1 字符集最多可以存放 85 UTF-8 格式的汉字 ...

utf-8 字符集最多可以存放 255 UTF-8 格式的汉字 ...

4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) 5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65532字节

a) 存储限制

varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用12个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535

b) 编码长度限制

字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766;

字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845

若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning

c) 行长度限制

导致实际应用中varchar长度限制的是一个行定义的长度。 MySQL要求一个行的定义长度不能超过65535

CHAR(M), VARCHAR(M)不同之处

 

CHARVARCHAR很类似,都是用来保存Mysql中较短的字符串,主要区别在于:CHAR列的长度固定为创建表时声明的长度,长度可以为从0~255的任何值,而VARCHAR的值可以是变长字符串,长度可以指定0~65535之间的值,在检索的时候,CHAR列会删除尾部的空格而VARCHAR则保留了这些空格。

从空间上考虑,用varchar合适;从效率上考虑,用char合适(更新较多而字段较少的字段)

如果分配给CHARVARCHAR列的值超过列的最大长度,则对值进行裁剪以使其适合。如果被裁掉的字符不是空格,则会产生一条警告。如果裁剪非空格字符,则会造成错误(而不是警告)并通过使用严格SQL模式禁用值的插入。

 

charvarchartext

长度的区别,char范围是0255varchar最长是64k,但是注意这里的64k是整个row的长度,要考虑到其它的column,还有如果存在not null的时候也会占用一位,对不同的字符集,有效长度还不一样,比如utf8的,最多21845,还要除去别的column,但是varchar在一般情况下存储都够用了。如果遇到了大文本,考虑使用text,最大能到4G

效率来说基本是char>varchar>text,但是如果使用的是Innodb引擎的话,推荐使用varchar代替char

charvarchar可以有默认值,text不能指定默认值

数据库选择合适的数据类型存储还是很有必要的,对性能有一定影响。

 

 

ENUMSET

ENUM 是一个字符串对象,其值通常选自一个允许值列表中,该列表在表创建时的列规格说明中被明确地列举。

enum只能取单值,他的数据列是一个枚举集合。它的合法取值列表最多允许有65535个成员。因此,在需要从多个值中选取一个时,可以使用enum。例如性别字段适合定义为enum类型。

Set可以取多个值。它的合法取值列表最多允许有64个成员。空字符串可是一个合法的set值。在需要取多个值时适合使用set类型。如一个人的兴趣爱好。

Enumset的值是以字符串的形式出现的,但在内部,MySQL以数值的形式存储它们。

                                               

 

 

 

在下列某些情况下,值也可以是空串('') NULL

 

如果将一个无效值插入一个 ENUM (即,一个不在允许值列表中的字符串),空字符串将作为一个特殊的错误值被插入。事实上,这个字符串有别于一个'普通的'空字符串,因为这个字符串有个数字索引值为 0。稍后有更详细描述。
◆如果一个 ENUM 被声明为 NULLNULL 也是该列的一个合法值,并且该列的缺省值也将为 NULL 。如果一个 ENUM 被声明为 NOT NULL,该列的缺省值将是该列表所允许值的第一个成员。

每个枚举值均有一个索引值:

◆在列说明中列表值所允许的成员值被从 1 开始编号。
◆空字符串错误值的索引值为 0。这就意味着,你可以使用下面所示的 SELECT 语句找出被赋于无效 ENUM值的记录行。
mysql> SELECT * FROM tbl_name WHERE enum_col=0;
NULL 值的索引值为 NULL

 

 字符串类型的个人理解:

一.varchar根据版本不同会有不同的内容,5.0之前的版本就不讨论了。

1.varchar(参数)后面的参数决定了varchar类型可以存放多少个字符(不管是中文还是英文都默认为一个字符),但是中文和英文的字节数是不同的,而且根据字符类型(gbk,utf8)不同会有差别。2.varchar最大大小是65532字节,这并不是意味着varchan可以存储65532个中英字符,而是存储的中英文字符的实际字节数不能超过65532个字节(这一点没有验证过varchar类型,只是试了一下定义一个char(255)类型的,往里面填入中文,试过是超过225个中文,软件就开始报错)。

二.CHAR(M), VARCHAR(M)不同之处。

1.char是固定长度,varchar是变长度。2.char相比较varchar减少了字符长度判断,varchar除了保存字符以外,还要保存字符长度。3.一般情况下char型效率快,占空间大,varchar型占空间小,效率慢。具体来说在相同字段完全填充的情况下,char型效率快。在相同字段不完全填充的情况下,char类型需要对空格进行删除操作,会对效率有所影响,具体会有多大的影响还需要验证。选择时根据字段需求来选择(经常更新,数据量大小)


三.char,varchar,text.

1.TEXT的效率最低,不能指定默认值。2.在遇到大文件才考虑使用TEXT类型。

四.ENUM  SET

1.都是属于枚举类型。2.ENUM只能多个选1个,SET可以多个选多个。3.枚举类型内部是存在索引值的。


浮点类型

                                               

关于上表的解释:

1Decimal型的取值范围和double相同。但是decimal的有效取值范围由MD决定,而且Decimal型的字节数是M+2。也就是说,定点数的存储空间是根据其精度决定的。

2MySQL中可以指定浮点数和定点数的精度。其基本形式如下:数据类型(M,D)

其中,“数据类型”参数是浮点数或定点数的数据类型名称,M参数称为精度,是数据的总长度,小数点不占位置。D参数成为标度,是指小数点后面的长度是D

举个例子:float(62)的含义数据是float型,数据长度是6,小数点后保留2位。所以,1234.56是符合要求的。

3,注意:上述指定的小数精度的方法虽然都适用于浮点数和定点数,但不是浮点数的标准用法。建议在定义浮点数时,如果不是实际情况需要,最好不要使用,如果使用了,可能会影响数据库的迁移。

4,相反,对于定点数而言,decimalM,D)是定点数的标准格式,一般情况下可以选择这种数据类型。

5如果插入值的精度高于实际定义的精度,系统会自动进行四舍五入处理,使值的精度达到要求。

 2,未指定精度的情况。

浮点数和定点数有其默认的精度,floatdouble默认会保存实际精度,但这与操作系统和硬件的精度有关。decimal型的默认整数位为10,小数位为0,即默认为整数。

·         总结:

MySQL中,定点数以字符串形式存储,因此,其精度比浮点数要高,而且浮点数会出现误差,这是浮点数一直存在的缺陷。如果要对数据的精度要求比较高,还是选择定点数decimal比较安全。



五.浮点类型和定点型的个人理解

1.浮点型数据的数据大小和精度生日可以用FLOAT(M,D)M:数据总长度 D:小数点长度来表示,但是实际的运算并非如此,其精度是会有误差的;2.在未指定精度的情况下,系统会给浮点型和定点型一个默认的精度;3.一般下尽量不选择浮点型,特别是对精度有要求的情况下。

日期与时间类型

datetimeyeardatetimetimestamp

                                               

根据上表可知,除了 timestamp 类型支持系统默认值设置,其他类型都不支持。 
如果建表语句中有:

ts_time1 time NOT NULL DEFAULT NOW();

ts_time3 yearNOT NULL DEFAULT NOW();

ts_time2 date NOT NULL DEFAULT CURRENT_TIMESTAMP();

ts_time2 datetime NOT NULL DEFAULT CURRENT_TIMESTAMP();

都会报错。所以想要设置某个日期列的默认值为当前时间,只能使用 timestamp 类型,并设置 DEFAULT NOW() DEFAULT CURRENT_TIMESTAMP() 作为默认值。



六.时间类型的个人理解

1. timestamp 类型支持系统默认值设置(new():获得当前系统时间),其他类型都不支持;2.时间类型会配合DATE函数使用;3.用int型数据保存时间在运算比较上会有优势。4.时间戳没有时区概念是一定唯一的时间,在编程中涉及到时间一般选择使用时间戳。


5   二进制类型

二进制类型是在数据库中存储二进制数据的数据类型。二进制类型包括binaryvarbinarybittinyblobblobmediumbloblongblob。这篇博客这里整理一下二进制类型的特点和差异。

                                               

BINARY类型和VARBINARY类型

BINARY类型和VARBINARY类型都是在创建表时指定了最大长度。基本的语法格式如下

字符串类型(M

 M”指定了该二进制数的最大字节长度为M

BINARY类型的长度是固定的,在创建表时就指定了。不足最大长度的空间由“\0”补全。例如,BINARY(50)就是指定BINARY类型的长度为50

VARBINARY类型的长度是可变的,在创建表时指定了最大长度。指定好了VARBINARY类型的最大值以后,其长度可以在0到最大长度之间。例如,VARBINARY(50)的最大字节长度是50。但是,不是每条记录的字节长度都是50,在这个最大值范围内,使用多少分配多少。VARBINARY类型实际占用的空间为实际长度加1。这样,可以有效的节约系统的空间。

BIT类型

BIT类型也是在创建表时指定了最大长度。

BIT(M)

其中,“M”指定了该二进制数的最大字节长度为MM的最大值为64

如果字段的类型为BIT(4),存储的数据是从015。因为,变成二进制以后,15的值为1111,其长度为4。如果插入的值为16,其二进制数为10000,长度为5,超过了最大长度,所以,大于等于16的数是不能插入到BIT(4)类型的字段中的。

在查询BIT数据类型的数据时,要用BIN(字段名b+0)来将值转换为二进制显示。

Bin(b+0)

b+0表示将二进制的结果转换为对应的数字的值,BIN()函数将数字转换为二进制。

·         blob类型

blob类型是一种特殊的二进制类型。blob可以用来保存数据量很大的二进制数据,如图片等。blob类型包括tinyblobblobmediumbloblongblob。这几种blob类型最大的区别就是能够保存的最大长度不同。longblob的长度最大,tinyblob的长度最小。blob类型与text类型很类似,不同点在于blob类型用于存储二进制数据,blob类型数据是根据其二进制编码进行比较和排序的,而text类型是文本模式进行比较和排序的。

 

 

·         关于几种二进制类型的总结

1blob类型主要用来存储图片,PDF文档等二进制文件,通常情况下,可以将图片,PDF文档都可以存储在文件系统中,然后在数据库中存储这些文件的路径,这种方式存储比直接存储在数据库中简单,但是访问速度比存储在数据库中慢。
2,实际编码中,使用二进制类型并不多,至少我从来没有使用过。这个就当了解一下好了。



七.二进制类型的个人理解

1.二进制类型与字符串类型类似,但是是用来保存二进制类型的数据的;2.图像、视频、音频类型的二进制文件可以使用二进制类型,,但是实际使用时并不会这么使用,效率太慢。一般是将二进制文件保存在文件中,数据库中只保留其链接(具体要怎么操作暂时还没有搜索)。

明天计划的事情:继续昨天的计划吧

遇到的问题:对于同一个问题,在网络上总会有不同的意见。最好还是自己实际验证一下,但是实际上并没有那么多时间可以去一一验证。所以记录一下,留存到接触实际项目时再根据实际情况判断一下
收获:

个人理解:

整形:1.整形后面的参数只是改变显示效果,没有设置字节的作用;2.当一个字段被定义为整形时系统会根据其类型选择分配长度;3.选择整型数据时,在可允许的范围内选择占字节最小的。

字符串类型:

一.varchar根据版本不同会有不同的内容,5.0之前的版本就不讨论了。

1.varchar(参数)后面的参数决定了varchar类型可以存放多少个字符(不管是中文还是英文都默认为一个字符),但是中文和英文的字节数是不同的,而且根据字符类型(gbk,utf8)不同会有差别。2.varchar最大大小是65532字节,这并不是意味着varchan可以存储65532个中英字符,而是存储的中英文字符的实际字节数不能超过65532个字节(这一点没有验证过varchar类型,只是试了一下定义一个char(255)类型的,往里面填入中文,试过是超过225个中文,软件就开始报错)。

二.CHAR(M), VARCHAR(M)不同之处。

1.char是固定长度,varchar是变长度。2.char相比较varchar减少了字符长度判断,varchar除了保存字符以外,还要保存字符长度。3.一般情况下char型效率快,占空间大,varchar型占空间小,效率慢。具体来说在相同字段完全填充的情况下,char型效率快。在相同字段不完全填充的情况下,char类型需要对空格进行删除操作,会对效率有所影响,具体会有多大的影响还需要验证。选择时根据字段需求来选择(经常更新,数据量大小)


三.char,varchar,text.

1.TEXT的效率最低,不能指定默认值。2.在遇到大文件才考虑使用TEXT类型。

四.ENUM  SET

1.都是属于枚举类型。2.ENUM只能多个选1个,SET可以多个选多个。3.枚举类型内部是存在索引值的。


五.浮点类型和定点型

1.浮点型数据的数据大小和精度生日可以用FLOAT(M,D)M:数据总长度 D:小数点长度来表示,但是实际的运算并非如此,其精度是会有误差的;2.在未指定精度的情况下,系统会给浮点型和定点型一个默认的精度;3.一般下尽量不选择浮点型,特别是对精度有要求的情况下。


六.时间类型

1. timestamp 类型支持系统默认值设置(new():获得当前系统时间),其他类型都不支持;2.时间类型会配合DATE函数使用;3.用int型数据保存时间在运算比较上会有优势。4.时间戳没有时区概念是一定唯一的时间,在编程中涉及到时间一般选择使用时间戳。


七.二进制类型

1.二进制类型与字符串类型类似,但是是用来保存二进制类型的数据的;2.图像、视频、音频类型的二进制文件可以使用二进制类型,,但是实际使用时并不会这么使用,效率太慢。一般是将二进制文件保存在文件中,数据库中只保留其链接(具体要怎么操作暂时还没有搜索)。





返回列表 返回列表
评论

    分享到