我正在使用一些数据库抽象层,其中大多数都使用像“String”这样的属性,它是VARCHAR 250或INTEGER,长度为11位。但是例如我的东西长度不到250个字符。我应该去减少它吗?它真的有任何有价值的差异吗?
提前致谢!
答案 0 :(得分:9)
INT长度什么都不做。所有INT都是4个字节。您可以设置的号码仅用于zerofill
(以及谁使用它??)。
VARCHAR长度更多。这是该领域的最大长度。保存VARCHAR以便仅存储实际数据,因此长度不会消失。这些天,你可以拥有比255个字节更大的VARCHAR(256 ^ 2-1)。区别在于字段长度使用的字节数。 VARCHAR(100)和VARCHAR(8)以及VARCHAR(255)使用1个字节来保存字段长度。 VARCHAR(1000)使用2。
希望有帮助=)
修改强>
我几乎总是让我的VARCHARs 250长。无论如何应该在应用程序中检查实际长度。对于较大的字段,我使用TEXT(存储方式不同,因此可以更长)。
修改强>
我不知道目前情况如何,但它曾经帮助我(理解):http://help.scibit.com/Mascon/masconMySQL_Field_Types.html
答案 1 :(得分:1)
在MySQL中不太确定,但在MS SQL中,它只会对足够大的数据库产生影响。通常情况下,我喜欢使用较小的字段来a)节省空间(从不伤害练习良好的习惯)和b)隐含的验证(如果你知道某个字段永远不应该超过10个字符,为什么允许11个,让单独250?)。
答案 2 :(得分:1)
首先,请记住,数据库旨在存储事实,旨在保护自己免受不良数据的侵害。因此,您不希望允许用户为名字输入250个字符的原因是用户将在其中放置不是名字的所有类型的数据。他们会把他们的全名,内衣大小,一本关于他们去年夏天所做的小说等等。因此,您希望努力强制数据尽可能正确。认为应用程序是防止错误数据的唯一保护因素是错误。您希望用户告诉您,他们遇到了将 War in Peace 填入指定列的问题。
因此,最重要的问题是,“存储数据的最合适值是什么?”理想情况下,您可以使用int
和检查约束来确保这些值具有适当的范围(例如,大于零,小于十亿等)。不幸的是,这是MySQL最大的弱点之一:它不支持检查约束。这只是意味着你必须在触发器中实现那些完整性检查,这些检查确实比较麻烦。
int
(4个字节)之间的差异是否会与tinyint
(1个字节)产生明显差异?显然,这取决于数据量。如果你的行数不超过10行,答案显然是否定的。如果你有100亿行,答案显然是“是”。但是,IMO,这是不成熟的优化。最好先关注确保正确性。
对于文本,您应该询问您的数据是否应该支持中文,日文或非ANSI值(即,您应该使用nvarchar还是varchar)?此值是代表真实世界代码,如货币代码,还是具有特定规格的银行代码?
答案 3 :(得分:0)
我认为Rudie是错误的,并非所有的INT都是4个字节...在MySQL中你有:
tinyint = 1个字节, smallint = 2个字节, mediumint = 3个字节, int = 4个字节, bigint = 8个字节。
我认为Rudie指的是“显示”,即你在创建列时在括号之间放置的数字,例如:
年龄INT(3)
您告诉RDBMS仅显示不超过3个数字。
并且VARCHAR是(可变长度的字符串)所以如果你声明让我们说名称varchar(5000)并且你存储一个像“Mario”这样的名字你只使用7个字节(5个用于数据,2个用于长度)值)。
答案 4 :(得分:0)
正确的字段大小用于限制可以放入的错误数据。例如,假设您有一个电话号码字段。如果你允许250个字符,你通常会在手机字段中得到如下内容(不是随机拍摄的例子):
Call the good-looking blonde secretary instead.
因此,首先限制长度是我们执行数据完整性规则的一部分。因此,这是至关重要的。
其次,数据页上只有这么多空间,而某些数据库允许您创建潜在记录长于数据页宽度的表,它们通常不允许您在存储时实际超过它数据。当突然无法保存一条记录时,这可能会导致一些非常难以发现的错误。我不知道MySql以及是否这样做但我知道SQL Server确实如此,并且很难弄清楚出了什么问题。因此,使数据的大小正确对于防止错误至关重要。