Mysql --常见数据类型

说到数据类型往往牵扯着数据类型的转换,如何选择合适的数据类型等
部分内容来源****等 如未注明 请及时联系我
以下内容是我个人对于mysql的学习和笔记  如有错误之处, 还请大神及时纠正。

说到数据类型 我们常常是在如何选择合适的数据类型上犯愁?
在解决上面的问题之前,我们必须清楚的知道数据类型有哪些?它们的区别是什么?

常见的数据类型主要分为以下几类:

一. 数值型

整型

  • INT(N)形式【普通大小整数值】(-2147483648 ~2147483647 )

    在开发有时候会看到int(6)这种情况,N值表示的是显示宽度,不足的用0补足,超过的无视长度而直接显示整个数字需要整型设置了unsigned zerofill才有效一般很少见。

  • TINYINT 【很小整数值】 (-128 ~ 127)

  • SMALLINT 【小整数值】 (-32768 ~ 32767)

  • BIGINT 【大的整数值】(-9223372036854775808 ~ 9223372036854775807)

  • MEDIUMINT 【中等大小整数值】(-8388608 ~ 8388607)

浮点型

  • FLOAT(M,D) [单精度]

    M表示浮点型数据总共的位数,比如,5.6789,M就是5 这只是举一个例子,来说明M,D是什么,实际是先有M,D的,然后在来控制数值,而不是更具数值来确定M,D。

    D表示浮点型数据小数点之后的精度,比如 5.6789 ,D就是4 ,假如超过D位则四舍五入
    如果不懂咱们举个例子:

create table float_drill(float_value float(3,1));

我们向表 float_drill 插入 5.69,56.78,5.438,349.2这几个数据 看看是不是和我们预想一样
思路 D为1,M为3 表示显示-99.9~ 99.9之间,像349.2 实际数据库中为99.9,D为1则表示小数点后保留1位小数如果超过则四舍五入
Mysql --常见数据类型
一般情况我们不指定参数 ,默认会按照实际的精度,也就是你写多少就是多少

  • DOUBLE(M,D) [双精度]
    double 和 float 的区别是  FLOAT显示后面的小数点位大概在40多位,DOUBLE能显示的就是300多位了,不是一个层次上的

  • [定点型] DECIMAL(M,D)
    其实通过上述例子发现float 和 double 会存在精度丢失的问题,而decimal无论写入数据中的数据是多少,都不会存在精度丢失问题,这就是我们要引入decimal类型的原因,decimal类型常见于银行系统互联网金融系统等对小数点后的数字比较敏感的系统中。

decimal(M,D)的规则和float/double相同,但区别在float/double在不指定M、D时默认按照 实际精度来处理而decimal在不指定M、D时默认为decimal(10, 0)

二. 字符串类型

  • CHAR(M)
      CHAR(M):为固定长度字符串,固定长度的意思就是M的值为多少,那么该M的值就是其实际存储空间的值,就算插入的数据少于M位,其存储空间还是那么大,多余的用空格补齐。在输出时,空格将被删除不输出。M最大为255,比如char(4),如果插入abc,则存储的值为’abc '后面多了一个空格,输出还是‘abc’, 存储空间还是占4个字节。M最大为255

  • VARCHAR(M)  
    VARCHAR(M):长度可变的字符串,跟CHAR相反,会根据实际的大小值来确定存储空间的大小,比如 VARCHAR(4),插入’ab’,则存储空间为3字节,看上面图就知道VARCHAR会多一个字节用来存储长度,M最大为65535.
    注意:字符串跟数值类型不一样,M为多大,就最多能插入多少字符,当M<255,但是插入数据又超过规定的大小,就会存储不全

  • TEXT(M) 
    text和varchar是一组既有区别又有联系的数据类型,其联系在于当varchar(M)的M大于某些数值时,varchar会自动转为text:
    M>255时转为tinytext
    M>500时转为text
    M>20000时转为mediumtext
    text可以指定text(M),但是M无论等于多少都没有影响

使用建议是能用varchar就用varchar而不用text(存储效率高),varchar(M)的M有长度限制,之前说过,如果大于限制,可以使用mediumtext(16M)或者longtext(4G)。

  • ENUM (N)
    枚举类型 格式:字段名 ENUM(‘值1’,‘值2’,‘值3’…,‘值N’); N最多为65535
    数据类型为ENUM的字段,那么在插入该字段中的值只能为枚举中的这几个值(N),不能插入别得值,否则报错

  • SET (N)
    格式:字段名 SET(‘值1’,‘值2’,‘值3’,‘值4’…,‘值n’) n最大为64
    SET的特点有一下3点:
      1、插入SET字段中的值如果有重复,则会自动删除重复的值
      2、插入SET字段中的值会按顺序排列,排列规则就是按照SET中的值的排列优先顺序
      3、如果插入了不属于SET中的值,就会报错

三. 时间日期类型

  • YEAR[1901~2155]

    重点看他的存储范围,1901~2155. 在插入该数值时,有两种方式,一种是用字符串来代表插入的YEAR值,另一种是用数字代表YEAR值
    在省略写年份时,

INSERT INTO tmp(year_value) VALUES(0),('0'),(00),('00'),(77),('77'),(11),('11');

Mysql --常见数据类型
红色表示是以数字的方式插入,蓝色表示是以字符串的方式插入

1、用字符表示和用数字表示的区别就在于0。如果是字符0或字符00,则在数据库中会生成2000,如果是数字0或00,则会生成0000.
2、在不超过70,也就是小于70,度会生成2000年以上,也就是如果是69,则生成2069.如果是70以上包含70,就会变成1970以上。比如70,就会变为1970。也就是00-69范围的年值转换为2000~2069. 70-99范围的年值转换为1970~1999
3、一般我们如果要使用,也就用全称,这样不容易混淆,但是得知道有这些特性

  • TIME[-838:59:59 ~ 838:59:59] [HH:MM:SS]

    HH表示小时 、MM表示分钟、SS表示秒
    这里的时间不仅仅可以用来表示一天的时间(也就是24小时),还可能是某件事情过去的时间或两个事件之间的时间间隔,比如昨天早上8点离现在上午9点 就超过了24小时,所以,这个TIME的取值范围就比我们所理解的24小时更大。

  • DATE[1000-01-01~9999-12-3] [YYYY-MM-DD]

    YYYY表示年份  MM表示月份  DD表示日
    MySQL允许“不严格”语法,也就是任何标点符号度可以当用日期部分之间的间隔符,比如"98.11.23"、“98/11/31”、"[email protected]@31"都可以,自己可以去尝试尝试,但是一般使用标准格式比较好,让人看起来舒服。

  • DATATIME [1000-01-01 00:00:00~9999-12-3 23:59:59][YYYY-MM-DD HH:MM:SS ]

    这个不用做多解释,因为这个就是DATE和TIME的结合体。其各种特点在这里也能够适合。但是注意HH:MM:SS 只能表示一天的时间,也就最多到23:59:59.

  • TIMESTAMP[1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:17 UTC]
    格式 [YYYY-MM-DD HH:MM:SS]
    UTC表示世界标准时间
    你会发现它于datatime格式一样,那么它们的区别是什么呢?
    区别:
    1.datetime占8个字节,timestamp占4个字节
    2.由于大小的区别,datetime与timestamp能存储的时间范围也不同
    3.atetime默认值为空,当插入的值为null时,该列的值就是null;timestamp默认值不为空,当插入的值为null的时候,mysql会取当前时间
    4.datetime存储的时间与时区无关,timestamp存储的时间及显示的时间都依赖于当前时区

timestamp也叫时间戳,指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数

从实际开发的角度我们一定要为合适的列选取合适的数据类型,尽量不要浪费空间,要知道,MySQL本质上是一个存储

对于这个格林威治时间为什么是1970年01月01日00时00分00秒引起了我的好奇心,如果你们也感兴趣的话可以参考
日期类的时间从为什么是从1970年1月1日(格林威治时间)[博客园 Frank_Le]
格林威治时间规定的原因 [百度百科]

以上主要参考:
MySQL(二) 数据库数据类型详解[博客园 一杯凉茶]
详解MySQL数据类型 [博客园 五月的仓颉]