在MySQL中签名或未签名

我不知道在使用UNSIGNED标志在MySQL中定义一些整数字段有任何积极的影响? 它使查询更快或数据库更小? 还是应该只关心上限呢?

根据MySQL 5.1手册第10.2节 :

在非严格模式下,当一个超出范围的值被分配给一个整数列时,MySQL存储表示列数据types范围的相应端点的值。 如果将256存储到TINYINT或TINYINT UNSIGNED列中,则MySQL分别存储127或255。 当为浮点或定点列指定的值超出指定的(或默认的)精度和范围所暗示的范围时,MySQL将存储表示该范围相应端点的值。

所以使用UNSIGNED只有当你关心上限的时候才是必要的。 此外,添加UNSIGNED不会影响列的大小,只是如何表示数字。

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

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

你可以使用一个tinyint,但只有当你使用它作为unsigned。

很多我见过的数据库,人们不会这样优化,最后得到一些相当大的表,因为他们总是使用INT。

不过,如果你正在谈论int vs unsigned int,那么根本没有性能影响或空间效应。

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

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

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

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

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

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

它会提高性能,假设你想search数量<50o。

如果没有“unsigned”:进程stream,由于数量字段是一个“int”,并且你有这个字段的索引,所以MySQL将定义范围为-2147483648到500,它将得到基于这个范围的结果。

使用“unsigned”:处理stream程,因为数量字段是一个“int”,其中“unsigned”,并且你有这个字段的索引,所以MySQL将把这个范围定义为0到500,并且根据这个范围得到结果。

在这里你可以看到SIGNED与UNSIGNED INTs范围的MySQL文档 。 你很快就会注意到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 

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

根据我的经验, UInt被EF读取为Long ,这可能会引起一些精度问题,因为UInt不是Long 。 任何不熟悉问题的人都可能会头痛。

其他问题:

EF和Mysql连接器6之间的集成问题

DBContext不能使用UINT

EF提供商与UINT的麻烦