CharField 最大长度 2^n 还是 2^n-1
为什么有的人在设置CharField的最大长度时用2的n次方,而有的人则用2的n次方减1呢?
举个例子:
在django.contrib.gis.db.backends.postgis.models(django 1.3版本)中:
class SpatialRefSys(models.Model, SpatialRefSysMixin): srtext = models.CharField(max_length=2048)
在django_openid_auth.models(djano-openid-auth 0.3版本)中:
class Nonce(models.Model): server_url = models.CharField(max_length=2047)
虽然这不是一个科学的测量,但2048似乎比2047更受欢迎,而255比256更常见。Django的文档提到,如果你在MySQL中使用unique=True,max_length会限制为255个字符。那么在其他情况下,为什么我会选择用2的n次方减1而不是2的n呢?
1 个回答
11
你基本上理解了。这里不仅仅是因为255的unique=True参数,还因为长度不超过255的字符串有时可以更高效地存储。
所以答案是,使用255而不是256可能有一定的道理,但对于其他长度来说,这种做法很可能是没必要的。一般来说,选择2的幂作为长度并不是出于科学原因(大多数人并没有实际测试过512长度的字段是否比513长度的字段让我们的应用运行得更快)。
不过,可能会有一些特定的应用场景,比如Django应用作为C应用的前端,在这种情况下,使用N^2-1个字符串可能在后续存储额外的结束字节\0
时会更有效。