引言
我在实际工作当中经常看到表设计有字段名字、数据类型、数据长度设置。
然后有的时候遇到过明明设置了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)
)表示最大字符数,严格限制了列可以存储的最大字符数。