【问题标题】:MySQL: Fields length. Does it really matter?MySQL:字段长度。真的有关系吗?
【发布时间】:2011-08-12 12:47:30
【问题描述】:

我正在使用一些数据库抽象层,其中大多数都使用诸如“String”之类的属性,它是 VARCHAR 250 或长度为 11 位的 INTEGER。但例如,我有一些长度少于 250 个字符的东西。我应该去减少它吗?它真的有什么有价值的区别吗?

提前致谢!

【问题讨论】:

    标签: mysql sql database database-abstraction


    【解决方案1】:

    首先,请记住,数据库旨在存储事实,旨在保护自己免受不良数据的影响。因此,您不想让用户输入 250 个字符作为名字的原因是用户会在其中放入不是名字的所有类型的数据。他们会写上他们的全名、内衣尺码、一本关于他们去年夏天干了什么的小说等等。因此,您要努力确保数据尽可能正确。假设应用程序是防止不良数据的唯一保护者是一个错误。您希望用户告诉您他们在将War in Peace填入给定列时遇到了问题。

    因此,最重要的问题是,“对于所存储的数据,最合适的值是多少?” 理想情况下,您应该使用 int 和检查约束来确保这些值有一个适当的范围(例如大于零,小于十亿等)。不幸的是,这是 MySQL 最大的弱点之一:它不遵守检查约束。这仅仅意味着您必须在触发器中实施这些完整性检查,这无疑更麻烦。

    int(4 字节)与tinyint(1 字节)之间的差异会显着不同吗?显然,这取决于数据量。如果您的行数不超过 10 行,答案显然是否定的。如果您将有 100 亿行,那么答案显然是“是”。但是,IMO,这是过早的优化。最好先专注于确保正确性。

    对于文本,您应该询问您的数据是否应该支持中文、日文或非 ANSI 值(即,您应该使用 nvarchar 还是 varchar)?该值是否代表真实世界的代码,如货币代码或具有特定规范的银​​行代码?

    【讨论】:

      【解决方案2】:

      正确的字段大小用于限制可以放入的错误数据。例如,假设您有一个电话号码字段。如果您允许 250 个字符,您通常会在电话字段中看到类似以下内容(示例并非随机选取):

      Call the good-looking blonde secretary instead.
      

      因此,首先限制长度是我们执行数据完整性规则的一部分。因此,这是至关重要的。

      其次,数据页上只有这么多空间,虽然某些数据库允许您创建潜在记录长于数据页宽度的表,但它们通常不允许您在存储时实际超过它数据。当突然无法保存一条记录时,这可能会导致一些很难找到的错误。我不知道 MySql 以及它是否会这样做,但我知道 SQL Server 会这样做,而且很难找出问题所在。因此,使数据大小正确对于防止错误至关重要。

      【讨论】:

        【解决方案3】:

        我认为 Rudie 是错误的,并非所有的 INT 都是 4 字节......在 MySQL 中你有:

        tinyint = 1 字节, smallint = 2 个字节, mediumint = 3 个字节, int = 4 字节, bigint = 8 个字节。

        我认为 Rudie 指的是“显示与”,即您在创建列时放在括号之间的数字,例如:

        年龄 INT(3)

        您只是告诉 RDBMS 显示不超过 3 个数字。

        而 VARCHAR 是(可变长度字符字符串),所以如果您声明名称 varchar(5000) 并存储像“Mario”这样的名称,则您只使用 7 个字节(5 个字节用于数据,2 个字节用于值)。

        【讨论】:

        • TINYITN 不是 INT 那么... INT = 4 字节。时期。在每种语言 (?) 中,在每个数据库 (?) 中都是一个 INT 4 字节。有些是有符号的,有些没有,但一个 INT 是 4 个字节。 TINYINT 不是 INT。另外:如果您将数字 800000 放在 INT(3) 字段中,则将显示所有 80000。无论INT(n) 的“大小”如何,都有 4 个字节可用。
        • tinyINT 它是一个 int,但很小。你放在括号里的数字不是尺寸,它只是“显示宽度”。
        • INTEGER 是一个表示字节集大小的词。 INT 表示 4 个字节。 TINYINT 也是一个非浮点数,与 INT 类似,但大小不同。因此,它不是 INT。 Pf谁在乎,我放弃了
        【解决方案4】:

        INT 长度什么都不做。所有 INT 都是 4 个字节。您可以设置的数字仅用于zerofill(以及谁使用它!?)。

        VARCHAR 长度做得更多。这是字段的最大长度。保存 VARCHAR 以便仅存储实际数据,因此长度无关紧要。如今,您可以拥有大于 255 个字节(即 256^2-1)的 VARCHAR。不同之处在于用于字段长度的字节。 VARCHAR(100) 和 VARCHAR(8) 和 VARCHAR(255) 使用 1 个字节来保存字段长度。 VARCHAR(1000) 使用 2。

        希望对您有所帮助 =)

        编辑
        我几乎总是将我的 VARCHAR 设置为 250 长。无论如何,应在应用程序中检查实际长度。对于更大的字段,我使用 TEXT(它们的存储方式不同,因此可以更长)。

        编辑
        我不知道这是多么流行,但它曾经帮助我(理解):http://help.scibit.com/Mascon/masconMySQL_Field_Types.html

        【讨论】:

        • 这真的是唯一的区别吗?这意味着 VARCHAR(255) 在性能方面与 VARCHAR(8) 相同,对吗?
        • 是的,没错。不同之处在于您可以存储的数量:存储的越多,表格的效率就越低。如果是真实数据,我也经常将 TEXT 用于较短的字段(60 多个字符左右),因为这些字段不存储在 InnoDB blob 中。
        • 取决于值,包含大量值为 8 个字符长的行的 VARCHAR(8) 比所有都是 1 个字符长的 VARCHAR(255) 慢;-) Rudie 的回答是正确的,不过。
        • -1 应在应用程序中检查实际长度。应在应用程序中检查实际长度。数据库应努力强制执行正确性并保护自己免受不良数据的影响。为什么不把每一列都写成varchar(8000)?因为如果你这样做了,就会有人试图把一本小说塞进那个领域。
        • @Rudie - 将取消 -1,因为您并没有暗示数据库不应该检查长度。但是,根据实际有意义的值调整字段的大小至关重要。
        【解决方案5】:

        在 MySQL 中不太确定,但在 MS SQL 中,它只对足够大的数据库有影响。通常,我喜欢使用较小的字段来 a) 节省空间(养成良好的习惯永远不会有坏处)和 b) 用于隐含验证(如果您知道某个字段不应超过 10 个字符,为什么要允许 11 个字符,让单独250?)。

        【讨论】:

        • 这很有趣。您能否发布指向 SQL Server 手册的链接,其中记录了声明的 max_length 的差异会影响整体大小?
        • 我必须四处寻找才能找到它,但我很确定它在官方 MS 文档中的某个地方......我正在这里工作记忆,自从我已经有一段时间了与 SQL Server 密切合作。
        • 我搜索了手册,但找不到与此相关的任何内容。这就是我问的原因。不过还是谢谢
        猜你喜欢
        • 1970-01-01
        • 2013-01-24
        • 1970-01-01
        • 2012-07-23
        • 1970-01-01
        • 1970-01-01
        • 2012-03-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多