我最近钻研了令人兴奋的SQL世界。我仍然试图围绕这些概念。我一直在线学习教程。其中许多教程都包含用于创建这样的表的SQL。
CREATE TABLE `users` (
`id` tinyint(4) NOT NULL AUTO_INCREMENT,
`username` varchar(10) NOT NULL,
`password` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
看到像id tinyint(4)
这样的行后,我想知道传递给数据类型的参数是什么。我认为“这是否意味着id可以是-128到127之间的任何整数(不超过4个字符)?”
所以我咨询了文档。这就是MySQL docs have to say about number type attributes。
显示宽度不会限制可以的值范围 存储在列中。它也不会阻止比列宽的值 正确显示显示宽度。例如,一列 指定为SMALLINT(3)的通常SMALLINT范围为-32768到 32767,超出三位数允许范围的值 使用三位以上显示完整
与可选(非标准)属性一起使用时 ZEROFILL,空格的默认填充替换为零。对于 例如,对于声明为INT(4)ZEROFILL的列,值为5 检索为0005。
所以,如果我正确读到这一点,除非你使用zerofill,否则声明像INT(255)
这样的东西是没用的。确定一个数据类型,数据库为该数据库分配了足够的空间,这是有意义的。
那么人们为什么要编写这样的代码呢?它有用吗?我完全误会了吗?
答案 0 :(得分:13)
这个额外的“功能”显示宽度非常混乱,因为像CHAR
这样的其他列类型指定了长度。
这是一个简短的细分:
ZEROFILL
,并且存储的数字的字符串表示形式短于显示宽度,则将使用零填充左边。如果它更长,没有任何反应。如果选择INT(5)且值为13,则返回为00013.如果值为123456,则返回为123456. ZEROFILL
,则根本没有填充(没有空格等)ZEROFILL
,则必须知道该列也将是UNSIGNED
我不喜欢显示宽度,因为存储层“知道”存储数据的可视化呈现。除此之外,我没有意识到这一点。