关于MySQL,你了解多少?_数据类型

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/maxiao124/article/details/78886707

MySQL支持的数据类型

  • 数值类型
  • 日期时间类型
  • 字符串类型

数值类型

整数类型 字节 最小值 最大值
TINYINT 1 有符号-128 /无符号0 有符号127 /无符号255
SMALLINT 2 有符号-32768 /无符号0 有符号32767 /无符号65535
MEDIUMINT 3 有符号-8388608 /无符号0 有符号8388607 /无符号1677215
INT、INTEGER 4 有符号-2147483648 /无符号0 有符号2147483647 /无符号4294967295
BIGINT 8 有符号-9223372036854775808 /无符号0 有符号9223372036854775807 /无符号18446744073709551615
浮点数类型 字节 最小值 最大值
FLOAT 4 ±1.175494351E-38 ±3.402823466E+38
DOUBLE 8 ±2.2250738585072014E-308 ±1.7976931348623157E+308
定点数类型 字节 描述
DEC(M,D) /DECIMAL(M,D) M+2 最大取值范围与DOUBLE相同,给定DECIMAL的有效取值范围由M和D决定
位类型 字节 最小值 最大值
BIT(M) 1~8 BIT(1) BIT(64)

**注意:**INT是INTEGER的同名词,DEC是DECIMAL的同名词

关于整数的可选属性:

UNSIGNED:如果需要在字段里面保存非负数或者较大的上限值时,可以用此选项,它的取值范围是正常值的下限取0,上限值取原上限值的2倍

AUTO_INCREMENT:在需要产生唯一标识符或顺序值时,可用此属性,AUTO_INCREMENT从1开始,每行增加1,在插入NULL到一个AUTO_INCREMENT列时,MySQL插入一个比该列中当前最大值大1的值。一个表中只能有一个AUTO_INCREMENT列。对于任何想要使用AUTO_INCREMENT的列,应该定义为NOT NULL,并定义为PRIMAERY KEY或定义为UNIQUE键,例如,可按下列任何一种方式定义AUTO_INCREMENT列:

create table ai(id int not null auto_increment primary key);
create table ai(id int not null auto_increment, primary key(id));
create table ai(id int not null auto_increment, unique(id));

关于小数的表示:

  1. 对于小数的表示,MySQL分为两种方式:浮点数和定点数。浮点数包括float(单精度)和double(双精度),而定点数则只有decimal一种表示。定点数在MySQL内部以字符串形式存放,比浮点数更精确,适合用来表示货币等精度要求高的数据。
  2. 浮点数和定点数都可以用类型名称后加“(M,D)”的方式来进行表示,表示该值一共显示M位数字(整数位+小数位),其中D表示位于小数点后面的位数,M和D又称为精度和标度。

例如,定义float(7,4)的一个列可以显示为-999.9999,MySQL保存值时进行四舍五入,因此,如果在float(7,4)列内插入999.00009,近似结果为999.0001。值得注意的是,浮点数后面跟“(M,D)”的用法是非标准用法,如果要用于数据库的迁移,则最好不要这么使用,float和double在不指定精度时,默认会按照实际的精度(由实际的硬件和操作系统决定)来显示,而decimal在不指定精度时,默认的整位为10,默认的小数位为0。

日期时间类型

日期和时间类型

日期和时间类型 字节 最小值 最大值
DATE 4 1000-01-01 9999-12-31
DATETIME 8 1000-01-01 00:00:00 9999-12-31 23:59:59
TIMESTAMP 4 19700101080001 2038年的某个时刻
TIME 3 -838:59:59 838:59:59
YEAR 1 1901 2155

日期和时间类型的零值表示

数据类型 零值表示
DATE 0000-00-00
DATETIME 0000-00-00 00:00:00
TIMESTAMP 00000000000000
TIME 00:00:00
YEAR 0000

注意:每种日期时间类型都有一个有效值范围,如果超出这个范围,在默认的SQLMode下,系统会进行错误提示,并将以零值来进行存储。

DATE、TIME、DATETIME是最常用的3种日期类型,TIMESTAMP和DATETIME的表示方法非常类似,区别主要有以下几点:

  1. timestamp支持的时间范围较小,datetime范围更大。
  2. 表中的第一个timestamp列自动设置为系统时间,如果在一个timestamp列中插入NULL,则该值将自动设置为当前的日期和时间。在插入和更新一行但不明确给timestamp列赋值时也会自动设置该列的值为当前的日期和时间,当插入的值超出取值范围时,MySQL认为该值溢出,使用“0000-00-00 00:00:00”进行填补。
  3. timestamp的插入和查询都受当地时区的影响,更能反映出实际的日期。而datetime只能反应出插入时当地的时区,其他时区的人查看数据必然会有误差。

函数返回的结果,其值适合DATETIME、DATE或TIMESTAMP,例如NOW()或CURRENT_DATE。

字符串类型

常规字符串类型

字符串类型 字节 描述及存储需求
CHAR(M) M M为0-255之间的整数
VARCHAR(M) M为0-65535之间的整数,值的长度+1个字节
TINYBLOB 允许长度0-255字节,值的长度+1个字节
BLOB 允许长度0-65535字节,值的长度+2个字节
MEDIUMBLOB 允许长度0-167772150字节,值的长度+3个字节
LONGBLOB 允许长度0-4294967295字节,值的长度+4个字节
TINYTEXT 允许长度0-255字节,值的长度+2个字节
TEXT 允许长度0-65535字节,值的长度+2个字节
MEDIUMTEXT 允许长度0-167772150字节,值的长度+3个字节
LONGTEXT 允许长度0-4294967295字节,值的长度+4个字节
VARBINARY(M) 允许长度0-M个字节的变长字节字符串,值的长度+1个字节
BINARY(M) M 允许长度0-M个字节的定长字节字符串

特殊字符串类型

  • ENUM

    中文名称叫枚举类型,它的值范围需要在创建表时通过枚举方式显式指定,对1~255个成员的枚举需要1个字节存储;对于255~65535个成员的枚举需要2个字节存储。最多允许有65535个成员。

这里写图片描述
插入数据:
这里写图片描述
可以看出ENUM类型是忽略大小写的,在存储”M”,”f”时将它们都转成了大写,还可以看出对于插入不在ENUM指定范围内的值时,并没有返回警告,而是插入了enum(“M”,”F”)的第一个值”M”。

  • SET

    SET和ENUM非常类似,也是一个字符串对象,里面可以包含0~64个成员。根据成员的不同,存储上也有所不同。

    • 1~8成员的集合,占1个字节。
    • 17~24成员的集合,占3个字节。
    • 25~32成员的集合,占4个字节。
    • 33~64成员的集合,占8个字节。

这里写图片描述
这里写图片描述
SET和ENUM除了存储之外,最主要的区别在于SET类型一次可以选取多个成员,而ENUM则只能选一个。
这里写图片描述
但是需要注意的是:
这里写图片描述
对于超出允许值范围的值将不允许注入,而对于包含重复成员的集合将只取一次。

猜你喜欢

转载自blog.csdn.net/maxiao124/article/details/78886707
今日推荐