• Mysql tinyint(1)与tinyint(4)的区别


    Mysql tinyint(1)与tinyint(4)的区别

    引言

    • 借由本篇文章来探讨下在Mysql数据库中数值类型tinyint(1)tinyint(4) 有啥区别呢?

    什么是tinyint(M)?

    • 先来了解下mysql中字符串类型varchar(M) 和数值类型tinyint(M) 的区别?

    • 字符串列类型: varchar(M) 而言,M 是字段中可以存储的最大字符长度,也就是说是字段长度。根据设置,当你插入超出字段长度的数据时,你很可能会收到错误提示,即使没有收到错误提示,你插入的数据也会被自动截断以适应该字段的预定义长度。所以,varchar(20) 和 varchar(40) 是不同的,其真实反映了该字段可以存储的数据长度。

    • 数值列类型:其长度修饰符表示最大显示宽度,与该字段物理存储没有任何关系。也就是说,tinyint(1) 和 tinyint(4) 能够存储的数值范围都是-128…127 (or for unsigned values 0…255),他们是相同的数据类型,当然他们还是有一点差异,以下会有说明。

    • 对于 tinyint 数据类型,只占 1 个字节:

    • - 无符号的(unsigned),范围是 0 到 255,默认长度是 3。
      - 有符号的(signed),范围是 -128 到 127,默认长度是 4。
      
      • 1
      • 2
    • 范围算法:tinyint占1个字节,一个字节 8 位,也就是1*8=8,可以表示的数字个数是 2的 8 次方(2^8 = 256个数字)。

    • 区别:若使用了 zerofill,当实际长度达不到指定的显示长度时,就会用 0 在前面补齐。(简记zerofill作用就是补零)

    测试

    • 先创建一张测试表,对 tinyint 类型都使用 zerofill。

    • CREATE TABLE `pre_demo` (
        `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
        `unsigned_t` tinyint(3) unsigned zerofill NOT NULL DEFAULT '000',
        `signed_t` tinyint(4) unsigned zerofill NOT NULL DEFAULT '0000',
        `t1` tinyint(1) unsigned zerofill NOT NULL DEFAULT '0',
        `t2` tinyint(2) unsigned zerofill NOT NULL DEFAULT '00',
        `t3` tinyint(3) unsigned zerofill NOT NULL DEFAULT '000',
        `t4` tinyint(4) unsigned zerofill NOT NULL DEFAULT '0000',
        `t5` tinyint(5) unsigned zerofill NOT NULL DEFAULT '00000',
        PRIMARY KEY (`id`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
    • 然后,插入测试数据。

    • NSERT INTO pre_demo VALUES(NULL,8,8,8,8,8,8,8);
      INSERT INTO pre_demo VALUES(NULL,123,123,123,123,123,123,123);
      
      • 1
      • 2
    • 最后,查询数据表中的数据。

    • mysql> SELECT * FROM pre_demo;
      +----+------------+----------+-----+-----+-----+------+-------+
      | id | unsigned_t | signed_t | t1  | t2  | t3  | t4   | t5    |
      +----+------------+----------+-----+-----+-----+------+-------+
      |  1 |        008 |     0008 |   8 |  08 | 008 | 0008 | 00008 |
      |  2 |        123 |     0123 | 123 | 123 | 123 | 0123 | 00123 |
      +----+------------+----------+-----+-----+-----+------+-------+
      2 rows in set (0.00 sec)
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8

    总结

    • tinyint(1) 与 tinyint(4) 能够存储的数据范围是一样的,都是 0 到 255(无符号的)。区别在于,当使用 zerofill 时,查询结果显示的长度可能不同。
    • zerofill 和 指定长度配合使用,可用于统一数据的显示长度,比如在数据库层面快速生成统一长度的流水号。
    • 一般情况下,无须刻意指定整型数据类型的长度。使用 MySQL 的默认长度tinyint(4) 即可。
  • 相关阅读:
    Centos7安装部署openLDAP并springboot集成openLDAP
    Mybatis动态SQL和分页
    多个列表参数一一对应使用枚举
    CSI室内指纹定位——相关通信名词解释
    最简单的el-cascadert省市区三级/二级联动
    MYSQL之DML(数据库操作语言)
    微积分 - 对数函数与指数函数的导数
    OpenPose训练教程
    java中流的分类
    面试之网络知识篇
  • 原文地址:https://blog.csdn.net/Andrew_Chenwq/article/details/133121501