• 【MySQL】数据类型(一)


    前言

    MySQL也有数据类型,其中一些与C/C++/Java是一样的,但也有一些数据类型不同,更有新的独有的数据类型

    在这里插入图片描述

    一. tinyint等整型

    MySQL将整型按照字节分成若干种
    其中,每个类型的最大最小值因有无符号也有不同

    在这里插入图片描述

    无符号:create table t1(num tinyint unsigned);
    有符号:create table t1(num tinyint);
    不携带unsigned默认为有符号

    插入数据时,如果超出该类型所能表示的最大最小值,MySQL会直接报错拦截

    比如,我们建立一个只含一个tinyint类型的表
    如果插入128和-129就会出现如下报错
    在这里插入图片描述


    在C/C++中,我们可以对char类型的变量赋值超过其表示范围的数据。编译器会进行截断。但这样就无法保证数据的正确性了。
    所以在MySQL中,如果插入数据超出表示范围,那么就直接拦截,这样保证数据的合法性和正确性。这也是MySQL约束的一种表现

    二. bit位字段类型

    bit就是比特位的意思

    bie(M) 位字段类型
    M表示每个值的位数,范围从1到64,如果M被忽略,默认为1

    如果创建表时,使用了比如65,超过bit范围的大小,会出现如下报错

    mysql> create table bit_test(
        -> id int,
        -> online bit(65)
        -> );
    ERROR 1439 (42000): Display width out of range for column 'online' (max = 64)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    创建如下表

    mysql> create table bit_test( 
        -> id int,
        -> online bit(10)
        -> );
    Query OK, 0 rows affected (0.02 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    插入若干数据

    mysql> insert into bit_test values (123,2);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> insert into bit_test values (123,3);
    Query OK, 1 row affected (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    但是显示时,无法显示online

    mysql> select * from bit_test;
    +------+--------+
    | id   | online |
    +------+--------+
    |  123 |       |
    |  123 |       |
    +------+--------+
    2 rows in set (0.00 sec)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这是因为bit的显示是按照ASCII码表显示的,如果我们分别插入’a’和97,最后显示的结果都是字符’a’

    mysql> insert into bit_test values (123,'a');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> insert into bit_test values (123,97);
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from bit_test;
    +------+--------+
    | id   | online |
    +------+--------+
    |  123 |       |
    |  123 |       |
    |  123 |  a     |
    |  123 |  a     |
    +------+--------+
    4 rows in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    我们可以在显示时将位字段转换成十六进制

    mysql> select id,hex(online) from bit_test;
    +------+-------------+
    | id   | hex(online) |
    +------+-------------+
    |  123 | 2           |
    |  123 | 3           |
    |  123 | 61          |
    |  123 | 61          |
    +------+-------------+
    4 rows in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    三. float浮点型

    float (m,d) [unsigned]
    m指定显示长度,d指定小数位数
    占用空间位4字节
    double与float类似,但是占用空间为8字节

    float(4,2)表示数值最长为4个数字,小数点后必须两位
    表示范围为-99.99~99.99
    如果插入超过表示范围的数据,MySQL同样会进行拦截报错

    mysql> create table float_test(
        -> id int,
        -> salary float(4,2)
        -> );
    
    mysql> insert into float_test values (1,99.999);
    ERROR 1264 (22003): Out of range value for column 'salary' at row 1
    
    mysql> insert into float_test values (1,100.0);
    ERROR 1264 (22003): Out of range value for column 'salary' at row 1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    float类型,在插入时会进行四舍五入
    比如:

    mysql> insert into float_test values (1,23.456);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> insert into float_test values (2,55.632);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from float_test;
    +------+--------+
    | id   | salary |
    +------+--------+
    |    1 |  23.46 |
    |    2 |  55.63 |
    +------+--------+
    2 rows in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    插入23.456会五入为23.46;插入55.632会四舍为55.63
    同时在插入数据时,也要避免四舍五入的影响,比如99.995,在五入后同样会超出范围


    float的无符号不会像int整型那样有更大的范围,比如float(4,2) unsigned表示的范围为0.00~99.99
    float因为其特殊的存储方式,在存储较大数值的数据时,容易出现误差

    mysql> insert into float_test2 values (1,236523627345.2323523);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from float_test2;
    +------+-----------------+
    | id   | salary          |
    +------+-----------------+
    |    1 | 236523634688.00 |
    +------+-----------------+
    1 row in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    四. decimal浮点型

    decimal(m,d) [unsigned]
    m指定长度,d指定小数点后位数

    decimal和float很相似
    decimal(4,2)表示范围同样是-99.99~99.99
    decimal(4,2) unsigned 可表示0~99.99

    但float和decimal表示的精度不同

    mysql> create table decimal_test(
        -> salary1 float(10,8),
        -> salary2 decimal(10,8)
        -> );
    
    mysql> insert into decimal_test values (23.12345612,23.12345612);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select *from decimal_test;
    +-------------+-------------+
    | salary1     | salary2     |
    +-------------+-------------+
    | 23.12345695 | 23.12345612 |
    +-------------+-------------+
    1 row in set (0.01 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    float表示的精度大致为7位


    decimal在存储较大数据时,也更为的精准

    mysql> create table decimal_test2(
        -> salary1 float,
        -> salary decimal
        -> );
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> insert into decimal_test2 values (123456789.12345,123456789.12345);
    Query OK, 1 row affected, 1 warning (0.00 sec)
    
    mysql> select * from decimal_test2;
    +-----------+-----------+
    | salary1   | salary    |
    +-----------+-----------+
    | 123457000 | 123456789 |
    +-----------+-----------+
    1 row in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    decimal整数最大位数m为65,。支持小数最大位数d是30.如果d被省略,默认为0,如果m被省略了,默认为10
    如果希望小数的精度高,或者数值较大,推荐使用decimal

    结束语

    感谢你的阅读

    如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
    在这里插入图片描述

  • 相关阅读:
    智能电表上的模块发热正常吗?
    普中51单片机学习(AD转换)
    Go语言核心编程(三) --协程
    docker部署MySQL主从
    C++构建response
    学习【五力模型】
    问题:在额定电压500V以下的电路中,使用的各种用电设备,一般称为(_ _ _)用电设备 #媒体#媒体#媒体
    电源插座是如何传输电的?困扰小伙伴这么多年的简单问题
    电池UN38.3试验概要内容有哪些,UN38.3认证
    哪种网站适合物理服务器
  • 原文地址:https://blog.csdn.net/m0_72563041/article/details/133294928