引言

我在实际工作当中经常看到表设计有字段名字、数据类型、数据长度设置。

数据表设计的字段“长度”

数据表设计的字段“长度”

然后有的时候遇到过明明设置了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)

虽然 CHARVARCHAR 类型的 M 参数表示最大字符数,而不是显示宽度,但它们有时也被称作显示宽度,因为它们决定了列的最大长度。

特殊说明

  • ZEROFILL:当使用 ZEROFILL 属性时,显示宽度会直接影响数值的显示格式。例如,INT(4) ZEROFILL 插入值 1 会显示为 0001
  • FLOATDOUBLE:在某些情况下,显示宽度会影响数值的显示格式,但不会影响存储。

总结

  • 整数类型:显示宽度(如 INT(11))主要用于建议性显示格式,特别是当使用 ZEROFILL 时。不会影响实际存储的数值范围。
  • 浮点数类型:显示宽度(如 FLOAT(10,2))不仅影响显示格式,还会影响存储的精度。
  • 固定精度类型:显示宽度(如 DECIMAL(10,2))不仅影响显示格式,还会影响存储的精度。
  • 字符串类型:长度参数(如 VARCHAR(10))表示最大字符数,严格限制了列可以存储的最大字符数。

欢迎关注拓行公众号,分享各种技术博客文章

拓行——奋勇进取,开拓未来,砥砺前行

最后修改:2024 年 11 月 05 日
如果您对各种技术博客文章感兴趣,欢迎关注拓行公众号,分享各种专业技术知识~