MySQL:为什么不使用zerofill指定显示宽度

时间:2012-09-25 23:08:06

标签: mysql database sqldatatypes

我最近钻研了令人兴奋的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)这样的东西是没用的。确定一个数据类型,数据库为该数据库分配了足够的空间,这是有意义的。

那么人们为什么要编写这样的代码呢?它有用吗?我完全误会了吗?

1 个答案:

答案 0 :(得分:13)

这个额外的“功能”显示宽度非常混乱,因为像CHAR这样的其他列类型指定了长度。

这是一个简短的细分:

  • 最重要的是:指定“存储空间”或“位数”。它只是说明此列中的数据在返回之前是如何格式化。 INT(5)可以存储相同的值,如INT(16)或INT(255) - 这三个值都可以存储对INT有效的所有(和唯一)值。 INT(255)不能存储255位数字。所有这些存储空间都是INT占用的空间。
  • 如果在具有显示宽度的列上使用ZEROFILL,并且存储的数字的字符串表示形式短于显示宽度,则将使用零填充左边。如果它更长,没有任何反应。如果选择INT(5)且值为13,则返回为00013.如果值为123456,则返回为123456.
  • 如果您不使用ZEROFILL,则根本没有填充(没有空格等)
  • 如果您使用ZEROFILL,则必须知道该列也将是UNSIGNED
  • 在任何情况下,查询表元数据时都会返回显示宽度。因此,应用程序可以知道如何格式化数据。

我不喜欢显示宽度,因为存储层“知道”存储数据的可视化呈现。除此之外,我没有意识到这一点。