【问题标题】:MySQL: Why specify display width without using zerofillMySQL:为什么不使用 zerofill 指定显示宽度
【发布时间】:2012-09-17 12:38:45
【问题描述】:

我最近深入研究了令人兴奋的 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) 之类的东西是没有用的。好的,你声明一个数据类型是有道理的,数据库会为该数据库分配足够的空间。

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

【问题讨论】:

  • 我不知道人们为什么要写这样的代码。它绝对没有任何目的,并且是许多误解的根源(如果你问我,这是 MySQL 中另一个糟糕的设计选择)

标签: mysql database sqldatatypes


【解决方案1】:

这个额外的“特性”显示宽度相当混乱,因为在其他列类型中,如CHAR 指定长度。

这是一个简短的细分:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多