您的位置:首页 > 数据库 > MySQL

MySQL常见数据类型详解

2018-03-06 21:02 423 查看
数据类型是定义列中可以存储什么数据以及该数据实际怎么存储的基本规则。

在MySQL中有如下几种数据类型:

数值类型

MySQL的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数。许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且MySQL允许我们指定数值字段中的值是否有正负之分或者用零填补。

整形

整形包括:

TINYINT

SMALLINT

MEDIUMINT

INT

BIGINT

表列出了整形数值类型以及它们的允许范围和占用的内存空间。



在MySQL中支持的5个主要整数类型是TINYINT,SMALLINT,MEDIUMINT,INT和BIGINT。这些类型在很大程度上是相同的,只有它们存储的值的大小是不相同的。

MySQL以一个可选的显示宽度指示器的形式对SQL标准进行扩展,这样当从数据库检索一个值时,可以把这个值加长到指定的长度。定义的基本形式如下:

整型类型(显示宽度)
1
[/code]

对于其正确的理解,其实是显示宽度,因为整型的显示宽度,对数值大小无影响,只是当设置了zerofill的时候,在显示的时候补0而已。

例如,指定一个字段的类型为INT(8) ZEROFILL,就可以保证所包含数字少于8个的值从数据库中检索出来时会在前面自动补0。如下图所示:



宽度可以不设置,因为整型数据类型都有默认的显示宽度,不设就采用默认的。

需要注意的是:

使用一个宽度指示器不会影响字段的大小和它可以存储的值的范围。

使用ZEROFILL这个修饰符还可以阻止MySQL数据库存储负值。

万一我们需要对一个字段存储一个超出许可范围的数字,MySQL会根据允许范围最接近它的一端截短后再进行存储。还有一个比较特别的地方是,MySQL会在不合规定的值插入表前自动修改为0。

UNSIGNED修饰符规定字段只保存正值。因为不需要保存数字的正、负符号,可以在存储时节约一个“位”的空间,从而增大这个字段可以存储的值的范围。

浮点型

MySQL支持的二个浮点型:

float[(M, D)]

double[(M, D)]

float数值类型用于表示单精度浮点数值,而double数值类型用于表示双精度浮点数值。

对M和D分析

浮点类型中的M和整型的大不相同

整型中的M与所存数据的大小没有关系,只在有ZEROFILL修饰符时,控制显示填充零的位数有关。

浮点类型中的M与所存数据的大小有必然关系,假如申请类型为float(6,2):其中,6代表浮点类型数不包括小数点在内为6位,其中2代表小数位,因此该列能存入-9999.99到+9999.99范围的数。

如果float(6,2) 带有标示符unsigned,则此数据类型的存储范围为:0.00到+9999.99。

对于小数点后面的位数超过允许范围的值,MySQL会自动将它四舍五入为最接近它的值,再插入它,但decimal会警告信息。



当不指定精度时,float、double默认会保存实际精度,而decimal默认是整数。



定点型

MySQL支持的定点型为:

decimal(M,D)

decimal数据类型用于精度要求非常高的计算中,这种类型允许指定数值的精度和计数方法作为选择参数。精度在这里指为这个值保存的有效数字的总个数,而计数方法表示小数点后数字的位数。比如语句decimal(7,3) 规定了存储的值不会超过7位数字,并且小数点后不超过3位。

例,



由此看出,decimal类型更精确。

注意:

忽略decimal数据类型的精度和计数方法修饰符将会使MySQL数据库把所有标识为这个数据类型的字段精度设置为10,计算方法设置为0。

UNSIGNED和ZEROFILL修饰符也可以被FLOAT、DOUBLE和 DECIMAL数据类型使用,并且效果与整型数据类型相同。

MySQL中可以指定浮点数和定点数的精度,其基本形式为:

数据类型(M,D)
1
[/code]

M:精度,数据的总长度

D:标度,小数点后的长度

字符串类型

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。可以存储的范围从简单的一个字符到巨大的文本块或二进制字符串数据。



CHAR与VARCHAR

其定义方式为:

字符串类型(M)
1
[/code]

char类型用于定长字符串,并且必须在圆括号内用一个大小修饰符来定义。这个大小修饰符的范围从0-255,比指定长度大的值将被截短,而比指定长度小的值将会用空格补于其后,查询之时再将空格去掉。所以char类型存储的字符串末尾不能有空格,varchar不限于此。

char类型的一个变体是varchar类型,它是一种可变长度的字符串类型,并且也必须带有一个范围在0-255之间的指示器。char和varchar不同之处在于MySQL数据库处理这个指示器的方式:

char把这个大小视为值的大小,不长度不足的情况下就用空格补足。

varchar类型把它视为最大值并且只使用存储字符串实际需要的长度(增加一个或二个额外字节来存储字符串本身的长度)来存储值。所以短于指示器长度的varchar类型不会被空格填补,但长于指示器的值仍然会被截短。

因为varchar类型可以根据实际内容动态改变存储值的长度,所以在不能确定字段需要多少字符时使用varchar类型可以大大地节约磁盘空间、提高存储效率,但char类型的字符串检索速度要比varchar类型的快。

TEXT

text分为4种,如下:



text最大64M的字节数,若是换算成中文字符的话,还跟字符类型有关系,比如UTF-8,一个中文为3个字节,那么字符个数就是(64/3)M个数中文字符。

注意:

text不能用一个大小修饰符来定义,text是实际字符数+2个字节。

text类型不能有默认值,写了默认值也不起作用。

varchar可直接创建索引,text创建索引要指定前多少个字符。varchar查询速度快于text,在都创建索引的情况下,text的索引似乎不起作用。

二进制类型

二进制类型是在数据库中存储二进制数据的数据类型。二进制类型包括BINARY、VARBINARY、BIT、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB。



BINARY和VARBINARY

两者唯一的差别在于BINARY当长度不够时会补
\0


BIT类型

其定义方式为:

BIT(M)
1
[/code]

其中M指定了该二进制的最大字节长度为M,M的最大值为64。如BIT(4)就是数据类型为BIT类型,长度为4,其能够存储的值为0-15。因为变成二进制后,15的值为1111。

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



上面的结果以二进制显示,最大的长度为4。

BLOB类型

BLOB类型是一种特殊的二进制类型。BLOB可以存储数据量很大的二进制数据,如图片,视频等。BLOB类型包括TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB,它们之间的区别也只是最大长度不同而已。

TEXT和BLOB的区别

BLOB和TEXT存储方式不同,TEXT以文本方式存储,英文存储区分大小写,而BLOB是以二进制方式存储,不分大小写。

BLOB存储的数据只能整体读出。

TEXT可以指定字符集,BLOB不用指定字符集。

日期和时间类型

在处理日期和时间类型的值时,MySQL带有5个不同的数据类型可供选择。它们可以被分成简单的日期、时间类型,和混合日期、时间类型。根据要求的精度,子类型在每个分类型中都可以使用,并且MySQL带有内置功能可以把多样化的输入格式变为一个标准格式。



TimeStamp类型与DateTime在无输入的情况下要注意下:

TimeStamp使用Current_TimeStamp()而DateTime使用NOW(来获取当前时间)

输入NULL时,系统会输入系统当前日期与时间

无任何输入时,系统会输入系统当前日期与时间

在开发中,很少用日期时间类型来表示一个需要精确到秒的列。原因:虽然日期时间类型能精确到秒,而且方便查看,但不易于计算机计算,所以用时间戳来表示。

时间戳:用int来存储,是1970-01-01 00:00:00到当前的秒数。一般存注册时间,商品发布时间等,并不是用datetime存储,而是用时间戳。因为datetime虽然直观,但计算不便,而用int型存储时间戳,方便计算,对于显示来说,也可以方便格式化。

数据类型的选择

整型:根据要显示的最大值决定。

浮点型:要显示小数,如果要精确到小数点后10位,就选择DOUBLE,而不应该选择FLOAT。DECIMAL精度较高,浮点数会出现误差,如果精度较高,则应选择定点数DECIMAL。

字符串型:定长与变长的区别,CHAR类型占用空间比较大,但是处理速度比VARCHAR快,如果长度变化不大,如身份证号码那种,最好选择CHAR类型,而对于评论字符串,最好选择VARCHAR。

时间:根据需要显示的类型咯,特别是TIMESTAMP,如果需要显示的时间与时区对应,就应该选择TIMESTAMP。

TEXT类型和BLOB类型:TEXT只能存储字符数据,而BLOB可以存储二进制数据。如果是纯文本,适合TEXT,如果是图片等适合存二进制。

问题总结

存储路径的问题

MySQL中,如果路径中使用”\”符号时,这个符号会被过滤。解决的办法是路径中用”/”或”\”来代替”\”,这样MySQL就不会自动过滤路径中的分隔符。

MySQL中的布尔类型

MySQL中没有Bool或Boolean类型,但是为了支持SQL标准,也可以定义Bool或Boolean类型的,但是Bool或Boolean类型最后转换成的是TinyInt(1),也就是说在MySQL中,布尔类型实际上是TinyInt(1)。

MySQL中如何存储JPG图片或MP3音乐

一般情况下,数据库中不直接存储图片和音频文件,而是存储图片或音频文件的路径,如果在特殊情况下需要在MySQL数据库中存储图片和音频文件,可以选择BLOB类型。

最后,吐露一下心声,写这篇文章真是操碎了心,并参考了一些文章,参考文章有:

MySQL教程 | 菜鸟教程

mysql数据类型 | 来自博客园的泪云山海

MySql数据类型分析 | 来自博客园的小张的学习之旅

mysql数据类型详解 | 来自zanyzhao的ChinaUnix博客

mysql基本数据类型详解 | 来自CSDN的libo222的博客
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: