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