• 每次在创建mysql表字段的时候,你是否想过字段长度到底多少合适?字母数字中文或者其他外文甚至表情字符各自占有的长度到底是多少?
  • 这篇文章我是用的是MySQL 8.0.24实际测试并记录的内容,也仅测试了常用的一些字段

varchar

这个字段的长度 测试发现最大长度是多少存储的字符串长度个数就是多少

text

此字段无法设置长度,所以使用这个字段的时候长度就没有限制

time

这个字段我在写这篇文章时基本没有用过,当长度设为1时默认格式是00:00:01.0(最后的小数点只能1位数字),当长度设为2时默认格式是00:00:01.00
(最后的小数点只能2位数字),因此可以推测出小数点后保留的是毫秒时间,字段长度保留的越长,那么时间就约精确。接下来我直接设置长度为20,报这样的错误
1426 - Too-big precision 20 specified for 'name'. Maximum is 6.,这样就知道了最大长度为6

tinyint

这个字段我用的就非常频繁了,最多的就是状态之类的,占用空间较小,常用于存储布尔值(0或1)或其他仅需要表示少量离散值的情况,但是这个字段的长度和上面几种开始就不一样了,例如设置长度为1有符号时范围是-128到127,长度为1无
符号时范围是0到255,具体使用哪种范围取决于创建表时是否指定了UNSIGNED(unsigned)属性;现在将长度设为2后发现存储值的范围并没有发生改变,在网上搜索了下资料,是这样的原理:

显示宽度与存储大小或类型包含的值的范围无关。可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度。显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示。当 mysql 为某些复杂的联结(join)生成临时表时,你可能会遇到问题,因为在这种情况下,mysql 信任地认为所有的值均适合原始的列宽度。

这个可选的宽度规格说明是用于在数值显示时,对某些值的宽度短于该列宽度的值进行左填补显示的,而不是为了限制在该列中存储值的宽度,也 不是为了限制那些超过该列指定宽度的值的可被显示的数字位 数。

要查看出不同效果记得在创建类型的时候加 zerofill这个值,表示用0填充,否则看不出效果的。

我们通常在创建数据库的时候都不会加入这个选项,所以可以说他们之间是没有区别的。

  • 这里我发现设置zerofill(填充0)时,会自动强制设为UNSIGNED(unsigned)属性

int

长度的设定值范围1-255(设置0时自动转为11,不设置时自动转为默认的11)(显示宽度),在此范围内任意长度值的字段值范围都是 -2147483648 ~ 2147483647(即-2³¹~2³¹-1),所以我们在使用 int 类型时,长度随便写

bigint

它可以存储从-9223372036854775808到9223372036854775807之间的整数。这个范围相当大,足够存储大多数常见的整数。bigint类型的长度为8字节(64位),这是因为bigint的取值范围需要64位来表示。无论存储的值大小如何,bigint的长度都保持不变。

通常用于需要存储大整数的场景。例如:

  • 存储用户ID,订单ID等。
  • 存储具有较大位数的电话号码或邮政编码。
  • 存储与时间相关的大整数,如Unix时间戳。