Mysql-整形INT[(M)]问题

问题描述

定义语法:INT[(M)] [UNSIGNED] [ZEROFILL] TINYINT[(M)] [UNSIGNED] [ZEROFILL]
示例:INT(10) TINYINT(1)
那么这个M是啥含义了。官网的解释概括起来就是:查询结果集中该字段显示的最大长度,如果字段的取值范围超过该限制,那么该字段正常完整显示


问题验证

a.创建测试表

CREATE TABLE `tbl_number`
(
    `id`           INT AUTO_INCREMENT  NOT NULL COMMENT '主键',
    `tinyint_org`  TINYINT(3)          NOT NULL COMMENT 'TINYINT对比',
    `tinyint_zero` TINYINT(3) ZEROFILL NOT NULL COMMENT 'TINYINT对比默认值0',
    `int_org`      INT(7)              NOT NULL COMMENT 'INT对比',
    `int_zero`     INT(7) ZEROFILL     NOT NULL COMMENT 'INT对比默认值0',
    PRIMARY KEY (`id`)
) ENGINE = InnoDB
  CHARSET = UTF8 COMMENT '说明NUMBER TYPE';

b.初始化测试数据

INSERT INTO `tbl_number` (`tinyint_org`, `tinyint_zero`, `int_org`, `int_zero`)
VALUES (1, 1, 1, 1),
       (12, 12, 123456, 123456);

c.查询示例

+----+-------------+--------------+---------+----------+
| id | tinyint_org | tinyint_zero | int_org | int_zero |
+----+-------------+--------------+---------+----------+
|  1 |           1 |          001 |       1 |  0000001 |
|  2 |          12 |          012 |  123456 |  0123456 |
|  3 |         123 |          123 | 1234567 |  1234567 |
+----+-------------+--------------+---------+----------+

d.php应用示例

fetch-field-directlength:The width of the field, as specified in the table definition.】。

$db = new mysqli('127.0.0.1:3307', 'root', 'xxxxxx', 'db');
$res = $db->query('select tinyint_org,int_zero from tbl_number where id = 2');
$org = $res->fetch_field_direct(0);
$zero = $res->fetch_field_direct(1);
echo 'org:' . $org->length . "\n";
echo 'zero:' . $zero->length . "\n";
$db->close();
org:3
zero:7

问题讨论

通过官方文档和结合我们的查询结果。

  • 默认情况下是在最左边补空格,但是在命令行形式下,忽略了展现形式。
  • 使用了ZEROFILL选项,我们可以显示的看出对比结果。
  • 应用程序可以获取到这个元数据,包含显示的最大长度。

问题总结

  • 如果没有特殊处理和需求,没有必要考虑这个M值。

问题参考