• 史上最全的mysql数据类型汇总-(上)


    图片

    mysql支持多种数据类型,主要有数值类型、日期/时间类型以及字符串类型。

    整数类型

    数值型数据类型主要用来存储数字,mysql提供了多种数值数据类型,不同的数据类型提供不同的取值范围,可以存储的值范围越大,其所需要的存储空间也会越大。

    mysql主要提供的整数类型有TINYINTSMALLINTMEDIUMINTINTBIGINT。整数类型的属性字段可以添加AUTO_INCREMENT自增约束条件。

    看下下面两个表;

    表一:mysql中的整数型数据类型

    表二、mysql不同整数类型的取值范围

    举个例子:

    year int(4);
    
    • 1

    该声明指明,在year字段中的数据一般只显示4位数字的宽度;

    注意点:

    显示宽度和数据类型取值范围是无关的。显示宽度只是指明mysql最大可能显示的数字个数,数值的位数小于指定的宽度时会由空格填充;如果插入了大于显示宽度的值,只要该值不超过该类型整数的取值范围,数值依然可以插入,而且能够显示出来。

    例如:向year字段插入一个数值12345,当使用select查询该列值的时候,mysql显示的将是完整的带有5位数字的12345,而不是4位数字的值。

    其他整数型数据类型也可以在定义表结构时指定所需要的显示宽度,如果不指定,则系统为每一种类型指定默认的宽度。

    不同的整数类型有不同的取值范围,并且需要不同的存储空间,因此应该根据实际需要选择最合适的类型,这样有利于提高查询的效率和节省存储空间。整数类型是不带小数部分的数值,现实生活中很多地方都需要用到带小数的数值。下面我们就来介绍下小数类型。

    注意点:

    显示宽度只用于显示,并不能限制取值范围和占用空间。

    浮点数类型和定点数类型

    mysql中使用浮点数和定点数来表示小数。

    浮点数类型有两种:

    • 单精度浮点类型(FLOAT)

    • 双精度浮点类型(DOUBLE)

    定点数类型只有一种:

    • DECIMAL

    浮点数类型和定点数类型都可以用(M,N)来表示。其中呢,我们用M称为精度,表示总共的位数N称为标度,表示小数的位数

    DECIMAL类型不同于FLOATDOUBLEDECIMAL实际是以串存放的,可能的最大取值范围和DOUBLRE一样,但是其有效的取值范围由MD的值来决定。怎么说呢?

    如果改变M而固定D,则其取值范围将随着M的变大而变大。

    那么在mysql中,浮点数类型和定点数类型的取值范围有多大呢?

    几乎正常业务情况下是不可能用完的,因为他们的取值范围如下:

    FLOAT类型的取值范围:

    • 有符号的取值范围:-3.402823466E+38 ~-1.175494351E-38

    • 无符号的取值范围:0和1.175494351E-38 ~3.402823466E+38

    DOUBLE类型的取值范围:

    • 有符号的取值范围:-1.7976931348623157E+308 ~-2.2250738585072014E-308

    • 无符号的取值范围:0和2.2250738585072014E-308~ 1.7976931348623157E+308

    注意点:

    无论是定点数还是浮点数类型,如果用户指定的精度超出精度范围,则会四舍五入。

    可能有点绕,举个栗子吧:

    创建一个数据表为yunweijia_1,字段类型如下;

    mysql> create table yunweijia_1 (x float(5,1), y double(5,1), z decimal(5,1));
    Query OK, 0 rows affected, 2 warnings (0.04 sec)
    
    mysql>
    
    • 1
    • 2
    • 3
    • 4

    然后我们在这个表中插入一条数据,sql语句如下:

    mysql> insert into yunweijia_1 values (6.66, 7.77, 8.888);
    Query OK, 1 row affected, 1 warning (0.01 sec)
    
    mysql>
    
    • 1
    • 2
    • 3
    • 4

    看上面的提示信息,是不是在我们执行插入语句的时候,给了一个警告信息,然后我们来看下这个警告信息是什么吧;

    mysql> show warnings;
    +-------+------+----------------------------------------+
    | Level | Code | Message                                |
    +-------+------+----------------------------------------+
    | Note  | 1265 | Data truncated for column 'z' at row 1 |
    +-------+------+----------------------------------------+
    1 row in set (0.00 sec)
    
    mysql>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    可以看到他提示说,z字段在插入的时候被截断了,但是xy截断就没有提出警告。那么查看下结果吧。

    mysql> select * from yunweijia_1;
    +------+------+------+
    | x    | y    | z    |
    +------+------+------+
    |  6.7 |  7.8 |  8.9 |
    +------+------+------+
    1 row in set (0.00 sec)
    
    mysql>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    可以看到分别都进行了四舍五入,这点需要注意。

    FLOATDOUBLE在不指定精度操作时,默认会按照实际的精度(由计算机硬件和操作系统决定),DECIMAL若不指定精度则默认为(10,0);

    浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的数据范围;他的缺点是会引起精度问题;

    注意点:

    mysql中,定点数以字符串形式存储,在对精度要求比较高的时候,使用DECIMAL的类型比较好,另外,两个浮点数进行减法和比较运算时,容易出现问题,所以在使用浮点数时需要注意,并尽量避免做浮点数比较。

    日期与时间类型

    mysql中有多种表示日期的数据类型,主要有:

    • DATETIME

    • DATE

    • TIMESTAMP

    • TIME

    • YEAR

    比如说,当只记录年信息的时候,可以只使用YEAR类型,而没有必要使用DATE

    每一个类型都有合法的取值范围,当指定确实不合法的值时系统将“零”值插入到数据库中。

    YEAR

    year类型是一个单字节类型,用于表示年,在存储时只需要1字节。可以使用各种格式指定year值,如下:

    1、以4位字符串或者4位数字格式表示的year,范围为1901~2155。输入格式为yyyy或者’yyyy’,例如:输入‘2022’或者2022,插入到数据库的值均为2022。

    2、以2位字符串格式表示的year,范围为“00”到“99”。“00”“69”和“70”“99”范围的值分别被转换为“2022”“2069”和“1970”“1999”范围的year值。“0”与“00”的作用相同。插入超过取值范围的值将被转换成2000

    3、以两位数字表示的YEAR,范围为199。169和7099范围的值分别被转换为200·2069和1970~1999范围的YEAR

    值。和字符相比较而言,这里的0值,将被转换成0000,而不是2000。

    注意点:

    两位整数范围与两位字符串范围稍有不同。例如,插入2000年,有人可能会使用数字格式的0表示year,实际上,插入数据库的值为0000,而不是所希望的2000。只有使用字符串格式的“0”或者“00”,才可以被正确的解释为2000,。非法YEAR值将被转换为0000。

    举个栗子:

    我们创建一个名为yunweijia_2的数据表,使用以下sql语句:

    mysql> create table yunweijia_2 (y year);
    Query OK, 0 rows affected (0.04 sec)
    
    mysql>
    
    • 1
    • 2
    • 3
    • 4

    然后我们往表中插入一条数据;

    mysql> insert into yunweijia_2 values(2022), ('2022');
    Query OK, 2 rows affected (0.01 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    
    mysql>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    再次尝试插入一条数据;

    mysql> insert into yunweijia_2 values ('2166');
    ERROR 1264 (22003): Out of range value for column 'y' at row 1
    mysql>
    
    • 1
    • 2
    • 3

    我们发现‘2166’超出了YEAR类型的取值范围,所以不能插入数据,这个时候我们看下mysql数据库中的数据;

    mysql> select * from yunweijia_2;
    +------+
    | y    |
    +------+
    | 2022 |
    | 2022 |
    +------+
    2 rows in set (0.00 sec)
    
    mysql>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    再举个栗子:

    首先我们先删除yunweijia_2数据表中的数据;

    mysql> delete from yunweijia_2;
    Query OK, 2 rows affected (0.01 sec)
    
    mysql>
    
    • 1
    • 2
    • 3
    • 4

    可以看到提示删除了两条数据;

    然后我们再插入以下数据;

    mysql> insert into yunweijia_2 values ('0'), ('00'), ('88'), ('22');
    Query OK, 4 rows affected (0.01 sec)
    Records: 4  Duplicates: 0  Warnings: 0
    
    mysql>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    然后看下结果是什么:

    mysql> select * from yunweijia_2;
    +------+
    | y    |
    +------+
    | 2000 |
    | 2000 |
    | 1988 |
    | 2022 |
    +------+
    4 rows in set (0.00 sec)
    
    mysql>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    从上面i看到,字符串‘0’和‘00’的作用相同,分别都转换成了2000年;‘88’转换成了‘1988’;‘22’转换成了‘2022’。

    又举个栗子:

    老规矩,先删除表中现有的数据;

    mysql> delete from yunweijia_2;
    Query OK, 4 rows affected (0.01 sec)
    
    mysql>
    
    • 1
    • 2
    • 3
    • 4

    然后再插入数据:

    mysql> insert into yunweijia_2 values (0), (99), (22);
    Query OK, 3 rows affected (0.01 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    
    mysql>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    看下结果:

    mysql> select * from yunweijia_2;
    +------+
    | y    |
    +------+
    | 0000 |
    | 1999 |
    | 2022 |
    +------+
    3 rows in set (0.00 sec)
    
    mysql>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    可以看到,0被转换成了0000,99被转换成了1999,22被转换成了2022。

    TIME

    time类型用在只需要时间信息的值,在存储时需要3字节,格式为HH:MM:SS

    其中,HH表示小时,MM表示分钟,SS表示秒。

    mysqltime类型的取值范围为-838:59:59~838:59:598,小时部分为什么会这么大呢,这是因为time类型不仅可以用来表示一天的时间,还可能是某个事件过去的时间或者两个事件之间的时间间隔。

    (1)‘D HH:MM:S’格式的字符串,可以使用下面任何一种“非严格”的语法:

    • ‘HH:MM:SS’

    • ‘HH:MM’

    • ‘D HH:MM’

    这里的D表示日,可以取0~34的值,在插入数据库时,D被转换成小时保存,格式为“D*24+HH”;

    (2)‘HH:MM:SS’格式的、没有间隔符的字符串或者HHMMSS格式的数值,假定是有意义的时间。例如:'223344’被理解成‘22:33:44’,但是‘223366’是不合法的(他有一个没有意义的秒部分),存储时将变成00:00:00。

    注意点:

    time列分配简写时应该注意,如果没有冒号,mysql解释值时,假定最右边的两位表示秒。如果time值中使用了冒号,则肯定被单做是当天的时间。

    例如:

    11:22 会被mysql解释成 00:11:22

    '11:22’会被mysql解释成11:22:00

    举个栗子:

    创建一个名为yunweijia_3的数据表;

    mysql> create table yunweijia_3(t time);
    Query OK, 0 rows affected (0.03 sec)
    
    mysql>
    
    • 1
    • 2
    • 3
    • 4

    往这个表中插入数据:

    mysql> insert into yunweijia_3 values ('10:06:06'), ('22:22'), ('2 10:10'), ('3 00'), ('20');
    Query OK, 5 rows affected (0.01 sec)
    Records: 5  Duplicates: 0  Warnings: 0
    
    mysql>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    看下表中的数据:

    mysql> select * from yunweijia_3;
    +----------+
    | t        |
    +----------+
    | 10:06:06 |
    | 22:22:00 |
    | 58:10:00 |
    | 72:00:00 |
    | 00:00:20 |
    +----------+
    5 rows in set (0.00 sec)
    
    mysql>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    小提示:

    在使用‘D HH’格式时,小时一定要使用双位数值,如果是小于10的小时数,应在前面加0以用来补全双位数值。

    再举个栗子 :

    首先我们删除数据表yunweijia_3里面的数据;

    mysql> delete from yunweijia_3;
    Query OK, 5 rows affected (0.01 sec)
    
    mysql>
    
    • 1
    • 2
    • 3
    • 4

    然后再表中插入数据:

    mysql> insert into yunweijia_3 values ('101112'), (111213), ('0');
    Query OK, 3 rows affected (0.01 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    
    mysql>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    再次向表中插入一条数据;

    mysql> insert into yunweijia_3 values (107010);
    ERROR 1292 (22007): Incorrect time value: '107010' for column 't' at row 1
    mysql>
    
    • 1
    • 2
    • 3

    可以看到这条数据没有插入成功,我看看下提示信息;

    mysql> show warnings;
    +-------+------+--------------------------------------------------------+
    | Level | Code | Message                                                |
    +-------+------+--------------------------------------------------------+
    | Error | 1292 | Incorrect time value: '107010' for column 't' at row 1 |
    +-------+------+--------------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    为什么这次会插入失败呢,是不是因为我们的分钟应该是小于60的啊,但是这里是70,所以报错了。

    我们查看下这个数据库中的数据现在的展示吧:

    mysql> select * from yunweijia_3;
    +----------+
    | t        |
    +----------+
    | 10:11:12 |
    | 11:12:13 |
    | 00:00:00 |
    +----------+
    3 rows in set (0.00 sec)
    
    mysql>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    又举个栗子:

    我们还可以使用系统函数向time字段列插入值;

    删除数据表yunweijia_3里面的数据;

    mysql> delete from yunweijia_3;
    Query OK, 3 rows affected (0.01 sec)
    
    mysql>
    
    • 1
    • 2
    • 3
    • 4

    然后在表中插入数据;

    mysql> insert into yunweijia_3 values (CURRENT_TIME), (NOW());
    Query OK, 2 rows affected (0.01 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    
    mysql>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    查看下数据库中的结果;

    mysql> select * from yunweijia_3;
    +----------+
    | t        |
    +----------+
    | 23:03:41 |
    | 23:03:41 |
    +----------+
    2 rows in set (0.00 sec)
    
    mysql>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    从结果中可以看到,获取系统当前的日志插入到time类型的列中。

    日期与时间类型还有几种,我们下一篇文章继续写,敬请关注。

    更多内容请转至VX公众号 “运维家” ,获取最新文章。

    ------ “运维家” ------

    ------ “运维家” ------

    ------ “运维家” ------

    linux中断异常,linuxuml建模,linux编译多个源文件,linux怎么更新时间,linux中的分页视频教程,
    linux怎么解压gzip,linux解压某个目录,怎么关闭linux网关,linux文件架构图,linux提高权限执行,
    linux文件用什么标志,网络安全linux加固,linux中查看邮件,linux修改背景颜色,linux环境下搭建网站。

  • 相关阅读:
    我理解的反射
    vue3.0 + JsBarcode 循环生成多个条形码(setup语法糖)
    C++ Web 编程
    HTTP服务器——tomcat的安装和使用
    yolov2
    房屋差价能否作为非违约方的损失
    计算机毕业设计Java毕业设计管理系统(源码+系统+mysql数据库+lw文档)
    学习贪心算法
    CKA、CKAD、CKS、LFCS、LFCA、LFCE 60$ 刀优惠券
    Physical 导入模式
  • 原文地址:https://blog.csdn.net/ouyangzhenxin/article/details/125887655