当前位置:首页 > 前端开发 > 正文

MySQL中int数据类型有哪些属性,怎么设置

MySQL数据类型支持的属性围绕数值范围、存储行为与业务约束展开,核心包括UNSIGNED、ZEROFILL、AUTO_INCREMENT、NOT NULL、DEFAULT和COMMENT,其中与int类型关系最密切的是UNSIGNED和AUTO_INCREMENT,而显示宽度属性自MySQL 8.0.17起已废弃。

mysql int类型长度设置与显示宽度废弃

很多人在建表时写过int(11),以为括号里的11限制了存储长度,实际上这是MySQL早期版本遗留的显示宽度属性,跟存储大小没有关系。

显示宽度属性到底做了什么

在MySQL 5.7及更早版本中,int(11)的11表示显示宽度,配合ZEROFILL使用时,不足11位的数字会在左侧补零,它不影响int能存储的最大值,也不改变占用的字节数,int固定占用4字节,有符号范围是-2147483648到2147483647,无符号范围是0到4294967295

这个设计容易让人误以为int(5)只能存5位数,实际它能存下2147483647,行业共识认为,这种误导性远大于它带来的对齐效果,所以MySQL从0.17版本开始废弃显示宽度,8.0.19版本正式移除,现在写int(11)或int(5)效果完全一样,存储和取值范围都不受影响。

建表时int类型怎么选

  • 主键ID用int unsigned,配合AUTO_INCREMENT使用,覆盖范围足够日常业务
  • 需要更大范围时选bigint,它占用8字节,支持到9223372036854775807
  • 年龄、数量、状态码这类明确非负的字段,加unsigned能扩大正数上限

tinyint默认范围是-128到127,加上unsigned后变成0到255,状态码用tinyint unsigned比tinyint多存一倍取值,省空间又够用。

mysql unsigned和zerofill属性的实际应用

这两个属性经常被放在一起讨论,但它们的用途完全不同,UNSIGNED负责去掉负数,ZEROFILL负责补零显示。

unsigned适合哪些业务场景

凡是业务上不可能出现负数的字段,都建议加unsigned,比如用户积分、商品库存、点击次数、订单金额(分单位存储),加了之后,正数上限直接翻倍,int从21亿变成42亿,tinyint从127变成255。

MySQL中int数据类型有哪些属性,怎么设置 第1张

从MySQL 8.0.17开始,整数类型的显示宽度被废弃,但unsigned和zerofill属性本身不受影响,它们继续发挥实际作用。

类型 默认范围 unsigned范围 占用字节
tinyint -128到127 0到255 1
smallint -32768到32767 0到65535 2
mediumint -8388608到8388607 0到16777215 3
int -2147483648到2147483647 0到4294967295 4
bigint -9223372036854775808到9223372036854775807 0到18446744073709551615 8

zerofill补零的实际使用场景

ZEROFILL会让数值按指定宽度左补零显示,同时自带UNSIGNED属性,比如订单号想保持6位统一显示,定义order_no int(6) zerofill,存入123,查询出来是000123,它只改显示格式,不改存储值,取出后仍是123。

需要注意的坑是,ZEROFILL的显示效果依赖客户端连接配置,某些图形化工具会直接显示原始数字,补零看不到,从MySQL 8.0.17起,zerofill属性本身也被标记为废弃,虽然暂时还能用,但新项目不建议依赖它做格式化,改用LPAD()函数或应用层处理更稳妥。

mysql auto_increment自增主键的完整配置

AUTO_INCREMENT是MySQL最常用的属性之一,专用于整数类型,让数据库自动生成递增编号,它通常配合主键使用,也可以用在普通索引列上,但每个表最多只能有一个AUTO_INCREMENT列。

创建自增主键表的操作路径

CREATE TABLE user ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(50) NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id) ) ENGINE=InnoDB;

插入数据时不需要指定id,MySQL会自动分配:

MySQL中int数据类型有哪些属性,怎么设置 第2张

查询结果id依次是1、2、3,删除id=2的记录后,再插入新数据,id会继续从4开始,不会复用已删除的编号。

使用AUTO_INCREMENT的硬性规则

  • 列类型必须是整数类型,包括tinyint、smallint、int、bigint
  • 必须建立索引,通常就是主键,也可以建在普通索引列上
  • 一个表只能有一个自增列
  • 不能指定DEFAULT值,AUTO_INCREMENT本身就是默认值生成器
  • 不支持负数,配合unsigned使用更合理
  • 搭配InnoDB引擎时,自增值在MySQL 8.0中持久化到undo log,重启后不会回退

自增主键常见问题处理

主键耗尽怎么办。 int unsigned最大到42亿,业务量大的表建议直接用bigint unsigned,一劳永逸,改成bigint的SQL:ALTER TABLE user MODIFY id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT;

批量插入时自增值跳跃。 使用INSERT ... VALUES一次插入多行,自增值按插入行数递增;使用INSERT IGNORE或REPLACE时,即使插入失败,自增值也可能被消耗掉,导致后续编号不连续,这是正常现象,不影响数据一致性。

手动指定id后自增值错乱。 如果插入时显式指定id为100,下次自增会从101开始,想重置自增起点,执行ALTER TABLE user AUTO_INCREMENT = 1;即可,但前提是表内现有id都小于1,否则会自动调整到当前最大id加1。

mysql数据类型支持的其他通用属性

除了数值类型专属的UNSIGNED、ZEROFILL、AUTO_INCREMENT,所有数据类型都支持以下通用属性,它们共同构成完整的字段定义。

NOT NULL与DEFAULT的配合逻辑

NOT NULL强制字段必须有值,DEFAULT提供缺省值,两者经常搭配使用:name VARCHAR(50) NOT NULL DEFAULT '',这样插入时如果不传name,自动填空字符串,且永远不会出现NULL。

NULL在MySQL中比较特殊,参与运算时结果大多为NULL,索引效率也低于NOT NULL字段,业内专家指出,多数业务表中允许为NULL的字段应该控制在较低比例,特别是WHERE条件中频繁使用的字段,尽量设为NOT NULL并给默认值。

COMMENT字段注释的重要性

COMMENT '用户昵称'写在字段定义末尾,给字段加注释,建表时顺手写清楚注释,比维护独立文档可靠得多,执行SHOW FULL COLUMNS FROM user;能直接看到注释内容,团队协作时减少沟通成本。

字符集与排序规则

字符串类型可以单独指定字符集:name VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,utf8mb4支持emoji和绝大多数文字,是当前主流选择,不合时宜的字符集设置,会导致中文乱码、索引长度超限等问题。

一张规范的建表语句模板

CREATE TABLE product ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', sku VARCHAR(32) NOT NULL DEFAULT '' COMMENT '商品编码', name VARCHAR(128) NOT NULL DEFAULT '' COMMENT '商品名称', price DECIMAL(10,2) UNSIGNED NOT NULL DEFAULT 0.00 COMMENT '销售价格', stock INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '库存数量', status TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态:0下架,1上架', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (id), UNIQUE KEY uk_sku (sku) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品表';

常见问题速查

mysql数据类型支持的属性有哪些

MySQL中数据类型支持的属性包括:UNSIGNED(无符号,仅数值类型)、ZEROFILL(零填充,仅数值类型,已废弃但可用)、AUTO_INCREMENT(自增,仅整数类型)、NOT NULL(非空约束)、DEFAULT(默认值)、COMMENT(字段注释)、CHARACTER SET(字符集,字符串类型)、COLLATE(排序规则,字符串类型),实际开发中,数值类型和日期类型还可以使用ON UPDATE配合DEFAULT实现自动更新时间。

int(11)和int的区别是什么

在MySQL 8.0及更高版本中,int(11)和int没有区别,显示宽度属性已废弃,两者存储范围完全一致,在MySQL 5.7及更低版本中,int(11)只影响与ZEROFILL配合时的补零显示宽度,不影响存储和取值范围,建表时直接写int或int unsigned即可,不需要纠结括号里的数字。

mysql unsigned和zerofill的取舍怎么选

业务字段明确非负时优先使用unsigned,扩大正数上限且语义清晰,zerofill的补零显示效果在MySQL 8.0中已标记废弃,新项目建议用LPAD函数或应用层格式化替代,老项目如果依赖zerofill显示效果,升级到8.0前需要评估兼容性。

MySQL数据类型属性的选择,直接关系到字段取值范围、存储效率和业务逻辑的严谨程度,掌握unsigned和AUTO_INCREMENT的适用场景,放弃对显示宽度的执念,建表时把NOT NULL、DEFAULT、COMMENT写规范,你的表结构就能稳定支撑业务很多年。

MySQL中int数据类型有哪些属性,怎么设置 第3张

0