正确使用MySQL类型字段

字段类型

MySQL的字段类型大致可以分为四种:1、数值类型 2、字符串类型 3、时间类型 4、复合类型

数值类型

MySQL的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数。

1bit 位 1字节=8bit 1k=1024字节 1M=1024k

类型 大小 范围(SIGNED) 范围(UNSIGNED) 用途
tinyint 1字节 (-128,127) (0,255) 小整数值
smallint 2字节 (-32768,32767) (0,65 535) 大整数值
mediumint 3字节 (-8 388 608,8 388 607) (0,16 777 215) 大整数值
int/integer 4字节 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
bigint 8字节 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
float 4字节 (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度浮点数值
double 8字节 (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度浮点数值
decimal decimal(M,D),如果M>D则为M+2,否则为D+2,要求M>=D 依赖于M,D的值 依赖于M,D的值 精确数值,会计系统中的货币数据

补充:有符号数与无符号数的区别?

最明显的区别就是二者表示的范围不同: 无符号数中,所有的位都用于直接表示该值的大小。

有符号数中最高位用于表示正负,所以,当为正值时,该数的最大值就会变小。有符号数高位段0代表正数,1代表负数。

举一个1字节的例子:

有符号:0111 1111 = 2^6+2^5+2^4+2^3+2^2+2^1+2^0 = 127; ==> 范围是 -128 ~ 127
无符号:1111 1111 = 2^7+2^6+2^5+2^4+2^3+2^2+2^1+2^0 = 255;==> 范围是 0 ~ 255

有符号数包括负数,无符号数只有整数,在同一数据类型中,内存长度是一样的。同样一个字节大小,有符号和无符号表示的范围不同,但个数相同均为256个。

INT

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

补充:int(1) 与 int(11) 的区别?

int(1)表示存储1位数?int(11)表示存储11位数?这是错误的!

int(M) 这里的M代表的并不是存储在数据库中的具体的长度,以前总是会误以为int(3)只能存储3个长度的数字,int(11)就会存储11个长度的数字,这是大错特错的。

其实当我们在选择使用int的类型的时候,不论是int(3)还是int(11),它在数据库里面存储的都是4个字节的长度,在使用int(3)的时候如果你输入的是10,会默认给你存储位010,也就是说这个3代表的是默认的一个长度,当你不足3位时,会帮你补全,当你超过3位时,就没有任何的影响。

我们在建表时可以选择是否填充零,以下是Navicat for MySQL建表时可选功能。

FLOAT、DOUBLE 和 DECIMAL

MySQL 支持的三个浮点类型是 FLOAT、DOUBLE 和 DECIMAL 类型。FLOAT 数值类型用于表示单精度浮点数值, DOUBLE 数值类型用于表示双精度浮点数值,DECIMAL 数值类型用于表示定点型数值。MySQL 浮点型和定点型可以用类型名称后加(M,D)来表示,M表示该值的总共长度,D表示小数点后面的长度,M和D又称为精度和标度。

与整数一样,这些类型也带有附加参数:一个显示宽度指示器和一个小数点指示器(必须要带有指示器,要不然会查不到结果,并且宽度指示器和XXint类型的宽度指示器不同,这里是有实际限制宽度的)。

FLOAT(7,3) 规定显示的值不会超过 7 位数字(包括小数位,最大值表示为 9999.999 ),小数点后面带有 3 位数字。对于小数点后面的位数超过允许范围的值,MySQL 会自动将它四舍五入为最接近它的值,再插入它。

DECIMAL(M,D) (M是表示有效数字数的精度。 M范围为1〜65。D是表示小数点后的位数。 D的范围是0~30。MySQL要求D<=M)数据类型用于精度要求非常高的计算中,这种类型允许指定数值的精度和计数方法作为选择参数。精度在这里指为这个值保存的有效数字的总个数,而计数方法表示小数点后数字的位数。比如语句 DECIMAL(7,3) 规定了存储的值不会超过 7 位数字,并且小数点后不超过 3 位。和FLOAT一样,对于小数点后面的位数超过允许范围的值,MySQL 会自动将它四舍五入为最接近它的值,再插入它。

DOUBLE 类型和FLOAT类似,对于小数点后面的位数超过允许范围的值,MySQL 会自动将它四舍五入为最接近它的值,再插入它。

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

在实际开发中我们尽量不要使用FLOAT、DOUBLE,使用DECIMAL 更好!因为FLOAT和DOUBLE求SUM的结果都是不精确的。

字符串类型

MySQL 提供了 10 个基本的字符串类型,可以存储的范围从简单的一个字符到巨大的文本块或二进制字符串数据。

UTF-8:UTF-8一个汉字占用(3)个字节,英文占用(1)个字节。
GBK:GBK一个汉字占用(2)个字节,英文占用(1)个字节。

类型 大小 用途
char 0-255字节 定长字符串
varchar 0-65535字节 变长字符串
tinyblob 0-255字节 不超过255个字符的二进制字符串
blob 0-65535字节 二进制形式的长文本数据
tinytext 0-255字节 短文本字符串
text 0-65535字节 长文本数据
mediumblob 0-16777215字节 二进制形式的中等长度文本数据
mediumtext 0-16777215字节 中等长度文本数据
longblob 0-4294967295字节 二进制形式的极大文本数据
longtext 0-4294967295字节 极大文本数据

在实际开发中,我们建表都是类似 char(20) 那么这括号中的20,是什么意思呢?注意,这里的20表示字符个数。

varchar(20)及char(20)都只能存储20个汉字或者只能存储20个字母或者只能存储汉字和字母的数量达到20的混合字。

时间类型

类型 大小(字节) 范围 格式 用途
date 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
time 3 '-838:59:59'/'838:59:59' HH:MM:SS 时间值或持续时间
year 1 1901/2155 YYYY 年份值
datetime 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
timestamp 4 1970-01-01 00:00:00/2038 YYYYMMDD HHMMSS 混合日期和时间值,时间戳

DATE、TIME 和 YEAR 类型

MySQL 用 DATE 和 YEAR 类型存储简单的日期值,使用 TIME 类型存储时间值。

DATETIME 和 TIMESTAMP 类型

除了日期和时间数据类型,MySQL 还支持 DATETIME 和 TIMESTAMP 这两种混合类型。它们可以把日期和时间作为单个的值进行存储。这两种类型通常用于自动存储包含当前日期和时间的时间戳,并可在需要执行大量数据库事务和需要建立一个调试和审查用途的审计跟踪的应用程序中发挥良好作用。

DateTime和TimeStamp最大的区别只是用的场景不同,如果你的应用 是用于不同时区(就是国内和国外同时使用),这时候如果用dateTime就会出现各种各样的问题,但是如果使用TimeStamp就不会出现这种时差的问题。

复合类型

MySQL 还支持两种复合数据类型 ENUM 和 SET,它们扩展了 SQL 规范。虽然这些类型在技术上是字符串类型,但是可以被视为不同的数据类型。一个 ENUM 类型只允许从一个集合中取得一个值,类似于单选按钮的功能。例如一个人的性别从集合{'男','女'}中取值,且只能取其中的一个值。;而 SET 类型允许从一个集合中取得任意多个值,类似于复选框的功能。例如一个人的兴趣爱好可以从集合{'听音乐','购物','看电影','打球','打游戏'}中取值,且可以多取多个值。

上一篇:漏洞预警:Apache Struts 2 远程代码执行漏洞


下一篇:日志审计携手DDoS防护助力云上安全