代码之家  ›  专栏  ›  技术社区  ›  Riho

MySQL中的签名或未签名

  •  51
  • Riho  · 技术社区  · 16 年前

    我想知道在MySQL中使用UNSIGNED标志来定义一些整数字段是否有任何积极的影响?它是使查询更快还是使数据库更小?或者,如果我担心上限,我应该只费心吗?

    8 回复  |  直到 16 年前
        1
  •  57
  •   Kevin Loney    16 年前

    根据 section 10.2 MySQL 5.1手册:

    在非严格模式下,当 将超出范围的值分配给 整数列,MySQL存储该值 代表相应 列数据类型的端点 范围。如果你将256存储到TINYINT中 或MySQL的TINYINT未指定列 分别存储127或255。什么时候 浮点或定点列 分配的值超过 指定(或 MySQL的精度和规模 存储表示 该范围的对应端点。

    因此,只有当你担心上限时,才需要使用UNSIGNED。此外,添加UNSIGNED不会影响列的大小,只会影响数字的大小 represented .

        2
  •  24
  •   Mark Garcia    10 年前

    这并不重要,除非你试图从价值观中获得最大的回报,并且不需要负值。

    例如,假设您想存储0-255。

    您可以使用tinyint,但前提是您将其用作unsigned。

    我见过的很多数据库,人们不会费心进行这样的优化,最终会得到一些相当大的表,因为他们一直在使用INT。

    尽管如此,如果你谈论的是int与unsigned int,则根本没有性能影响或空间效应。

    从标准的角度来看,我总是使用unsigned,只有当我知道我需要负值时才使用signed。

        3
  •  19
  •   d-_-b    10 年前

    说到性能或存储,这绝对是一回事。

    作为一般规则,请使用更适合您的值:如果您只需要正值,请将值存储为UNSIGNED,否则,将其设置为默认[SIGNED]。

    当为PRIMARY AUTOINCREMENT列设置SIGNED值时,会出现一个问题:自动生成的数字的计数从1开始(不是最小的负数),可能的值将提前结束,因为您将只使用一半的值。因此,在这种情况下(PRIMARY+AUTOINCREMENT列),最好将其存储为UNSIGNED。

        4
  •  10
  •   ʞɔıu    16 年前

    当列仅包含正数时,使用unsigned。

    它不会影响列上的任何I/O性能,因为它仍然会占用完全相同的空间。

        5
  •  4
  •   user1646191    12 年前

    这将提高性能,假设你想搜索数量<50度。

    无签名: 流程,由于数量字段是一个int,并且您有该字段的索引,MySQL将定义范围为-2147483648到500,并将根据此范围获得结果。

    未签名: 流程,由于数量字段是一个无符号的int,并且你有这个字段的索引,MySQL会将范围定义为0到500,并根据这个范围得到结果。

        6
  •  3
  •   zmonteca    11 年前

    在这里你可以看到 MySQL documentation 对于有符号与无符号的INTs范围。你很快就会注意到,未点火INT的下限始终为0,因此它永远不会为负。

    Type    Storage Minimum Value   Maximum Value
            (Bytes) (Signed/Unsigned)   (Signed/Unsigned)
    TINYINT     1   -128            127
                    0               255
    SMALLINT    2   -32768          32767
                    0               65535
    MEDIUMINT   3   -8388608        8388607
                    0               16777215
    INT         4   -2147483648     2147483647
                    0               4294967295
    BIGINT      8   -9223372036854775808    9223372036854775807
                    0               18446744073709551615
    
        7
  •  1
  •   Community CDub    8 年前

    警告 ,未签名Int(UINT)和实体框架或ADO存在问题。网。它可能涉及MySqlConnector版本6的集成问题。

    根据我的经验, UInt 读作 Long EF,这可能会引发一些精度问题,因为 无符号整型 不是 长的 。这可能会让任何不熟悉这个问题的人头疼。

    其他问题:

    Integration problem between EF and Mysql Connector 6

    DBContext cannot use UINT

    EF provider trouble with UINT

        8
  •  0
  •   lubosdz    6 年前

    我更喜欢使用无符号小INT(或中INT)而不是有符号INT。 节省2(或1) bytes 这有时会在大型数据集上提供更好的性能,特别是在索引列的情况下。