8

我最近深入研究了令人兴奋的 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 文档对数字类型属性的看法

显示宽度不限制可以存储在列中的值的范围。它也不会阻止正确显示比列显示宽度更宽的值。例如,指定为 SMALLINT(3) 的列的 SMALLINT 范围通常为 -32768 到 32767,超出三位数允许范围的值使用多于三位的数字完整显示

当与可选(非标准)属性 ZEROFILL 结合使用时,空格的默认填充将替换为零。例如,对于声明为 INT(4) ZEROFILL 的列,值 5 被检索为 0005。

因此,如果我没看错的话,INT(255)除非您使用 zerofill,否则声明之类的东西是无用的。好的,您声明数据库为该数据库分配足够空间的数据类型是有道理的。

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

4

1 回答 1

17

这个额外的“功能”显示宽度非常令人困惑,因为在其他列类型中,比如CHARis 指定了长度。

这是一个简短的细分:

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

我不喜欢显示宽度,因为存储层“知道”存储数据的视觉呈现。除此之外,我知道没有任何用处。

于 2013-01-23T23:24:29.880 回答