我想知道在MySQL中定义一些整数字段时使用UNSIGNED标志会有什么积极影响吗?它是否使查询更快或数据库更小?或者,如果我担心上限,我应该只打扰它吗?
答案 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 UInt
被Long
读取,这可能会引发一些精确性问题,因为UInt
不是Long
。对于不熟悉这个问题的人来说,这可能会引起头痛。
其他问题:
答案 7 :(得分:0)
相对于SIGNED INT,我更喜欢使用UNSIGNED SMALLINT(或MEDIUMINT)。 它节省了2(或1)个bytes,这有时会在大型数据集上表现更好,尤其是对于索引列。