小言_互联网的博客

MySQL的数据类型

600人阅读  评论(0)


MySQL的数据类型主要包括以下四大类
整数类型: bit 、 bool 、 tinyint 、 smallint 、 mediumint 、 int 、 bigint
浮点数类型: float 、 double 、 decimal
字符串类型: char 、 varchar 、 tinyblob 、 blob 、 mediumblob 、 longblob 、tinytext 、 text 、 mediumtext 、 longtext
日期类型: Date 、 DateTime 、 TimeStamp 、 Time 、 Year


整数类型

类型 字节数
tinyint[(n)] [unsigned] 1
smallint[(n)] [unsigned] 2
mediumint[(n)] [unsigned] 3
int[(n)] [unsigned] 4
bigint[(n)] [unsigned] 8

上面[]包含的内容是可选的,默认是有符号类型的,无符号的需要在类型后面跟上 unsigned

通过创建表时,为相关的列设置类型:

CREATE TABLE `test3` (
 `a` int(11) DEFAULT NULL,
 `b` int(5) DEFAULT NULL,
 `c` int(5) unsigned DEFAULT NULL,
 `d` int(5) unsigned zerofill DEFAULT NULL,
 `e` int(5) unsigned zerofill DEFAULT NULL,
 `f` int(10) unsigned zerofill DEFAULT NULL,
 `g` int(10) unsigned zerofill DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

浮点数类型

类型 字节大小 范围(有符号) 范围(无符号) 用途
float[(m,d)] 4 (-3.402823466E+38,3.402823466351E+38) [0,3.402823466E+38) 单精度浮点数值
double[(m,d)] 8 (-1.7976931348623157E+308,1.7976931348623157E+308) [0,1.7976931348623157E+308) 双精度浮点数值
decimal[(m,d)] 对DECIMAL(M,D) ,如果M>D为M+2,否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值

float数值类型用于表示单精度浮点数值,而double数值类型用于表示双精度浮点数值,float和double都是浮点型,而decimal是定点型

浮点型和定点型可以用类型名称后加(M,D)来表示,M表示该值的总共长度,D表示小数点后面的长度,M和D又称为精度和标度。

float和double在不指定精度时,默认会按照实际的精度来显示,而DECIMAL在不指定精度时,默认整数为10,小数为0。

在为浮点型字段插入记录时需要注意以下事项:

  • float和double采用的是四舍六入五成双
  • 浮点数float、double如果不写精度和标度,则会按照实际显示
  • decimal采用的是四舍五入
  • decimal插入的数据超过精度之后会触发警告
  • decimal不写精度和标度,小数点后面的会进行四舍五入,并且插入时会有警告

什么是四舍六入五成双?

就是5以下舍弃5以上进位,如果需要处理数字为5的时候,需要看5后面是否还有不为0的任何数字,如果有,则直接进位,如果没有,需要看5前面的数字,若是奇数则进位,若是偶数则将5舍掉

float 、double 会存在精度问题,decimal 精度正常的。比如银行对统计结果要求比较精准的建议使用 decimal


日期类型

类型 字节大小 范围 格式 用途
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结束时间是第2147483647 秒,北京时间 2038-1-19 11:14:07格林尼治时间 2038年1月19日 凌晨03:14:07 YYYYMMDDHHMMSS 混合日期和时间值,时间戳

字符串类型

类型 范围 存储所需字节 说明
char(M) [0,m],m的范围[0, 2的8次方减1] m 定长字符串
varchar(M) [0,m],m的范围[0, 2的16次方减1] m 0-65535 字节
tinyblob 0-255字节 L+1 不超过 255 个字符的二进制字符串
blob 0-65535字节 L+2 二进制形式的长文本数据
mediumblob 0-16777215字节 L+3 二进制形式的中等长度文本数据
longblob 0-4294967295字节 L+4 二进制形式的极大文本数据
tinytext 0-255字节 L+1 短文本字符串
text 0-65535字节 L+2 长文本数据
mediumtext 0-16777215字节 L+3 中等长度文本数据
longtext 0-4294967295字节 L+4 极大文本数据

表格中的L表示存储的数据本身占用的字节,L 以外所需的额外字节为存放该值的长度所需的字节数。MySQL 通过存储值的内容及其长度来处理可变长度的值,这些额外的字节是无符号整数。

char类型占用固定长度,如果存放的数据为固定长度的建议使用char类型,如:手机号码、身份证等固定长度的信息。


数据类型选择建议

选小不选大:一般情况下选择可以正确存储数据的最小数据类型,越小的数据类型通常更快,占用磁盘,内存和CPU缓存更小。
简单就好:简单的数据类型的操作通常需要更少的CPU周期,例如:整型比字符操作代价要小得多,因为字符集和校对规则(排序规则)使字符比整型比较更加复杂。
尽量避免NULL:尽量制定列为NOT NULL,除非真的需要NULL类型的值,有NULL的列值会使得索引、索引统计和值比较更加复杂。
浮点类型的建议统一选择decimal
记录时间的建议使用int或者bigint类型,将时间转换为时间戳格式,如将时间转换为秒、毫秒,进行存储,方便走索引

时间和时间戳的相互转换

将时间转化为时间戳(如果参数为空,则处理为当前时间)
select unix_timestamp(‘2020-05-17 16:53:29’)

将时间戳转换为时间
select from_unixtime(1589705609)


转载:https://blog.csdn.net/weixin_43894879/article/details/106172728
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场