MySQL int类型的显示

本文详细解析MySQL中整数字段的显示宽度属性,包括其作用、计算方式及实际应用,强调从MySQL 8.0.17版本开始不再推荐使用,并提供替代方案。

前言

如果你见过int(4),又发现它能写入10000、100000甚至更大的数据,那么本文可以帮你稍解疑惑。

先划重点:int是定长字段,存储开销固定是4个字节。

关于MySQL所有字段的字段长度、存储开销,可参考《MySQL所有类型的长度范围、存储开销(区分显示宽度/有无符号)》

既然是定长字段,那这个4就很扎眼了。它就是接下来要说的显示宽度:仅表示存储值不足4位时、显示为4个字符的宽度。

适用字段类型

MySQL的整数类型都支持显示宽度,但仅影响数字的显示,对数据存储没有影响(整数类型都是定长)。

显示宽度为可选扩展属性,字段声明时可不写。

从MySQL 8.0.17开始,整数类型已经不推荐使用显示宽度,所以声明类型是建议不写。

计算与填充方式

显示宽度按字符数计算:

  • 存储数据不足显示宽度,用空格补齐;
    • 与可选(非标准)的ZEROFILL属性一起使用,默认的空格填充将替换为零;例如,列INT(4) ZEROFILL,值5将显示为0005
    • 如果指定ZEROFILL数字列,MySQL会自动添加该UNSIGNED 属性
    • 从MySQL 8.0.17开始,不推荐对数字类型使用ZEROFILL1
  • 存储数据超过显示宽度,显示完整数据;
  • 显示宽度可超过存储长度,按显示宽度补齐空位。

    一般用于表示显示完整数据,比如INT最大值10进制只有10位,因此INT(11)可显示完整数据。但这种方式没有太大必要。

附上实验的截图,可以清晰的看到各种效果:
在这里插入图片描述

实际使用

设置了显示宽度后,MySQL结果集中返回的数据,就会按显示宽度组织数据(填充空格或0),但是否使用(按显示宽度显示数据),取决于应用程序。

比如MySQL客户端默认会按显示宽度展现数据,而Java中JDBC等框架,会按声明的类型处理数据。如果int(4)字段对应的Java类型是java.lang.Integer,肯定不会显示宽度(转类型时自动处理),但如果是java.lang.String,就可以显示了(字符串保留)。

Spring-jdbc源码中数据抽取的逻辑:

// 执行sql成功,提取数据
org.springframework.jdbc.core.JdbcTemplate.query() 221> var3 = rse.extractData(rs);
 	// 逐行遍历解析
	> org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData() 33> results.add(this.rowMapper.mapRow(rs, var3++));
		// 逐列遍历,组装数据行
		> org.springframework.jdbc.core.ColumnMapRowMapper.mapRow() 27> mapOfColumnValues.put(this.getColumnKey(column), this.getColumnValue(rs, i));
			// 抽取列元素
			> org.springframework.jdbc.support.JdbcUtils.getResultSetValue() 185> Object obj = rs.getObject(index);
			> com.mysql.jdbc.ResultSetImpl.getObject() 2714> return this.getInt(columnIndex);

按照上面这样,会自动将MySQL返回的byte数组转为int基类型,类型转换时将自动去除左侧的0和空格;如果要保留显示宽度,需要类型转换时使用getString()而不是getInt方法

再次提醒:从MySQL 8.0.17开始,整数类型不推荐使用显示宽度,在将来的MySQL版本中,将删除对整数类型显示宽度的支持。必要的情况下,推荐应用程序使用LPAD()函数、或者将格式化的数字存储在CHAR列中。


以上。感谢您的阅读。


  1. 显示宽度的官方文档:https://dev.mysql.com/doc/refman/5.6/en/numeric-type-attributes.html ↩︎

### MySQL INT类型长度设置的规则和影响 在MySQL中,`INT`类型的长度设置主要指的是显示宽度,而是存储空间或取值范围。以下是关于`INT`类型长度设置的作用与限制的详细说明: #### 1. 显示宽度的定义 `INT(M)`中的`M`表示显示宽度,它仅用于控制数据的显示格式,并会影响实际存储的空间大小或取值范围[^1]。例如,`INT(5)`表示该字段的显示宽度为5个字符。如果插入的数据长度小于5,则显示时会补齐空格;如果插入的数据长度大于5,则仍然完整显示所有字符。 #### 2. 存储空间与取值范围 无论显示宽度如何设置,`INT`类型的存储空间始终固定为4字节,其取值范围也保持变: - 有符号:`-2^31`到`2^31 - 1`(即`-2147483648`到`2147483647`)。 - 无符号:`0`到`2^32 - 1`(即`0`到`4294967295`)[^2]。 即使将`INT`类型显示宽度设置为较小的值(如`INT(3)`),其存储空间仍然是4字节,最大值也会被限制为999。 #### 3. 填充零(ZEROFILL)的影响 当为`INT`类型字段添加`ZEROFILL`属性时,显示宽度会变得有意义。此时,MySQL会在数值前自动填充零,直到达到指定的显示宽度。例如: ```sql CREATE TABLE test ( id INT(5) ZEROFILL NOT NULL ); ``` 如果插入值`123`,则显示为`00123`[^4]。 #### 4. 临时表生成时的影响 在某些复杂的联结操作中,MySQL可能会生成临时表。在这种情况下,MySQL会假设所有值都能适应原始列的宽度。如果显示宽度设置过小,可能会导致数据截断或其他问题。因此,在设计表结构时,建议根据实际需求合理设置显示宽度[^3]。 #### 5. 同整型类型的对比 MySQL提供了多种整型类型,包括`TINYINT`、`SMALLINT`、`MEDIUMINT`、`INT`和`BIGINT`。这些类型的主要区别在于存储空间和取值范围。例如: - `TINYINT`:1字节,范围为`-128`到`127`(有符号)或`0`到`255`(无符号)。 - `SMALLINT`:2字节,范围为`-32768`到`32767`(有符号)或`0`到`65535`(无符号)。 - `INT`:4字节,范围为`-2147483648`到`2147483647`(有符号)或`0`到`4294967295`(无符号)。 - `BIGINT`:8字节,范围为`-9223372036854775808`到`9223372036854775807`(有符号)或`0`到`18446744073709551615`(无符号)[^2]。 ### 示例代码 以下是一个创建表并测试`INT`类型显示宽度的示例: ```sql CREATE TABLE test_int ( id INT(5) NOT NULL, number INT(5) ZEROFILL NOT NULL ); INSERT INTO test_int (id, number) VALUES (123, 123); SELECT * FROM test_int; -- 结果: -- id: 123 -- number: 00123 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值