在MySQL中签名或未签名

时间:2009-01-25 20:40:48

标签: mysql database-design

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

8 个答案:

答案 0 :(得分:56)

根据MySQL 5.1手册的section 10.2

  

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

因此,只有在关注上限时才使用UNSIGNED。另外,添加UNSIGNED不会影响列的大小,只是数字为represented

答案 1 :(得分:22)

除非你试图从价值中获得最大的收益并且不需要负值,否则无关紧要。

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

您可以使用tinyint,但仅当您将其用作未签名时。

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

但是,如果你在讨论int vs unsigned int,那么根本没有性能影响或空间效应。

从标准的角度来看,我总是使用无符号,只有当我知道我需要负值时才使用签名。

答案 2 :(得分:19)

在性能或存储方面,它绝对是一回事。

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

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

答案 3 :(得分:9)

当列仅包含正数时使用无符号。

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

答案 4 :(得分:4)

它将改善性能,假设您想要搜索数量< 50O。

没有“无符号”: 处理流程,因为数量字段是“int”并且您有该字段的索引,MySQL将范围定义为-2147483648到500,它将根据此范围得到结果。

使用“unsigned”: 处理流程,因为数量字段是带有“无符号”的“int”,并且您有该字段的索引,MySQL将定义范围为0到500,它将根据此范围得到结果。

答案 5 :(得分:3)

在这里,您可以看到MySQL documentation的SIGNED与UNSIGNED INT的范围。您很快就会注意到UNSIGNED 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

答案 6 :(得分:1)

警告,Unsigned Int(UINT)和Entity Framework或ADO.NET存在问题。它可能涉及MySql Connector版本6的集成问题。

根据我的经验,EF UIntLong读取,这可能会引发一些精确性问题,因为UInt不是Long。对于不熟悉这个问题的人来说,这可能会引起头痛。

其他问题:

Integration problem between EF and Mysql Connector 6

DBContext cannot use UINT

EF provider trouble with UINT

答案 7 :(得分:0)

相对于SIGNED INT,我更喜欢使用UNSIGNED SMALLINT(或MEDIUMINT)。 它节省了2(或1)个bytes,这有时会在大型数据集上表现更好,尤其是对于索引列。