发现 mysql 定义的数据类型不管用,定义的整数 1 位,也可以插入多位数字

2020-10-17 10:50:30 +08:00
 myevery

发现 mysql 定义的数据类型不管用,定义的整数 1 位,也可以插入多位数字

create table t1 (id int(1)); insert into t1 (id) values (-1); insert into t1 (id) values (-123); insert into t1 (id) values (-12345); insert into t1 (id) values (23); insert into t1 (id) values (123); insert into t1 (id) values (12345);

完全不报错,可以正常写入! 这是为啥,这么不严谨么,难道是为了容错!

3236 次点击
所在节点    MySQL
11 条回复
user8341
2020-10-17 10:57:08 +08:00
其实没分那么细吧。都是 unsigned int
hbolive
2020-10-17 10:57:36 +08:00
你定义的是一个 int 整形的数据,其存储范围:- 2147483648 至 2147483647 或 0 至 4294967295,这个是固定的而不是你定义的,括号中的是显示长度,你把它理解为了“我定义它显示 1 位”。。
hbolive
2020-10-17 10:58:37 +08:00
@hbolive 最后句是:你把它理解为了“我定义它只能存储 1 位的数字”
myevery
2020-10-17 11:01:03 +08:00
@hbolive 是啊,我是这样理解的,难道不是这么理解么。
如果不是,那个 1 是不是就没意义了呢。
lovecy
2020-10-17 11:03:43 +08:00
mysql 只有前缀带 var 的才允许你定义数量,其他的都是固定的。

另外能学一下 markdown 语法排个版么,排版乱+感叹号看着不舒服。
myevery
2020-10-17 11:16:32 +08:00
@lovecy 好的好的,谢谢!
hanzhao
2020-10-17 11:35:26 +08:00
2 楼说的有一点纠正:int(M) M 是“最小显示长度”,可以配合 zerofill 属性使用 int(2) 1=>01 11=>11 111=>111
tairan2006
2020-10-17 12:37:12 +08:00
那个是显示位宽

你应该用 tinyint smallint int bigint 这些
lovecy
2020-10-17 14:45:41 +08:00
@myevery #2#7#8 说的都对,我查了一下,这个貌似是 MYSQL 设计留下来的没啥用的东西,只在字段有 zerofill 的时候,查询结果数字如果不足位数,前面补 0
比如 id int(6) zerofill,你存 1,123,1234 查询出来的结果就是 000001,000012,001234
比如 id int(2) zerofill,你存 1,123,1234 查询出来的结果就是 01,12,1234
bear2000
2020-10-18 11:22:27 +08:00
括号里显示的是指显示的位数,不是指能存储的位数
sockball07
2020-10-18 16:17:20 +08:00
面试常考🤧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/715858

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX