我想知道在MySQL中定义一些整数字段时使用UNSIGNED标志会有什么积极影响吗?它是否使查询更快或数据库更小?或者,如果我担心上限,我应该只打扰它吗?
根据MySQL 5.1手册的10.2节:
在非严格模式下,当将超出范围的值分配给整数列时,MySQL会存储表示列数据类型范围的相应端点的值.如果将256存储到TINYINT或TINYINT UNSIGNED列中,MySQL将分别存储127或255.当浮点或定点列分配超过由指定(或默认)隐含的范围精度和标度的MySQL存储表示该范围的相应的端点的值.
因此,只有在关注上限时才使用UNSIGNED.同时添加UNSIGNED不会影响列的大小,只是表示数字的表示方式.
除非你试图从价值中获得最大的收益并且不需要负值,否则无关紧要.
例如,假设你想存储0-255.
您可以使用tinyint,但仅当您将其用作未签名时才使用.
我见过很多数据库,人们不打算像这样优化并最终得到一些相当大的表,因为他们只是一直使用INT.
不过,如果你在讨论int vs unsigned int,那么根本就没有性能影响或空间效应.
从标准的角度来看,我总是使用无符号,只有当我知道我需要负值时才使用签名.
在性能或存储方面,它绝对是一回事.
作为一般规则,请使用更适合您的方法:如果您只需要正值,则将值存储为UNSIGNED,否则,将其设为默认值[SIGNED].
为PRIMARY AUTOINCREMENT列设置SIGNED值时会出现一个问题:自动生成的数字的计数从1开始(不是最小的负数),可能的值将提前结束,因为您将只使用一半的值.因此,在这种情况下(PRIMARY + AUTOINCREMENT列),最好存储为UNSIGNED.
当列仅包含正数时,请使用无符号.
它不会影响列上的任何I/O性能,因为它仍将占用完全相同的空间量.