Loading... ## 引言 我在实际工作当中经常看到表设计有字段名字、数据类型、数据长度设置。 ![数据表设计的字段“长度”](https://static.hw13.cn/usr/uploads/2024/11/2711504914.png) 然后有的时候遇到过明明设置了`int(1)`但是,插入大数据(比如`123`)仍成功 当时工作嘛,能用管他干嘛,现在闲下来了,就在考虑这个问题了。 ## 显示宽度 ≠ 实际数据宽度 > 在 MySQL 中,显示宽度(display width)主要用于某些数据类型,以提供一种**建议性**的显示格式。 也就是说,**这只是用来看着好看的!!!并不限制存储长度!** 这些数据类型包括: ### 1. 整数类型 - `TINYINT[(M)] [UNSIGNED] [ZEROFILL]` - `SMALLINT[(M)] [UNSIGNED] [ZEROFILL]` - `MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]` - `INT[(M)] [UNSIGNED] [ZEROFILL]` - `BIGINT[(M)] [UNSIGNED] [ZEROFILL]` 这里的 `M` 就是显示宽度。例如,`INT(11)` 表示建议的显示宽度为 11 个字符。 **需要注意的是,显示宽度不会影响实际存储的数值范围** 只是在某些显示场景下(如使用 `ZEROFILL`填充`0`)会有影响。 简单来说,`int(11)`和`int(1)`在储存数据长度没有任何差异, 只是数据较长(11位)的时候,建议用`int(11)`来更好的显示。 ### 2. 浮点数类型 - `FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]` - `DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]` - `REAL[(M,D)] [UNSIGNED] [ZEROFILL]`(等同于 `DOUBLE`) 这里的 `M` 是总宽度,`D` 是小数部分的宽度。例如,`FLOAT(10,2)` 表示总宽度为 10 个字符,其中小数部分占 2 个字符。 ### 3. 固定精度类型 - `DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]` - `NUMERIC[(M[,D])] [UNSIGNED] [ZEROFILL]`(等同于 `DECIMAL`) 这里的 `M` 是总宽度,`D` 是小数部分的宽度。例如,`DECIMAL(10,2)` 表示总宽度为 10 个字符,其中小数部分占 2 个字符。 ### 4. 字符串类型 - `CHAR(M)` - `VARCHAR(M)` 虽然 `CHAR` 和 `VARCHAR` 类型的 `M` 参数表示最大字符数,而不是显示宽度,但它们有时也被称作显示宽度,因为它们决定了列的最大长度。 ### 特殊说明 - **`ZEROFILL`**:当使用 `ZEROFILL` 属性时,显示宽度会直接影响数值的显示格式。例如,`INT(4) ZEROFILL` 插入值 `1` 会显示为 `0001`。 - **`FLOAT` 和 `DOUBLE`**:在某些情况下,显示宽度会影响数值的显示格式,但不会影响存储。 ### 总结 * **整数类型**:显示宽度(如 `INT(11)`)主要用于建议性显示格式,特别是当使用 `ZEROFILL` 时。不会影响实际存储的数值范围。 * **浮点数类型**:显示宽度(如 `FLOAT(10,2)`)不仅影响显示格式,还会影响存储的精度。 * **固定精度类型**:显示宽度(如 `DECIMAL(10,2)`)不仅影响显示格式,还会影响存储的精度。 * **字符串类型**:长度参数(如 `VARCHAR(10)`)表示最大字符数,严格限制了列可以存储的最大字符数。 欢迎关注拓行公众号,分享各种技术博客文章拓行——奋勇进取,开拓未来,砥砺前行 最后修改:2024 年 11 月 05 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果您对各种技术博客文章感兴趣,欢迎关注拓行公众号,分享各种专业技术知识~