2013-08-26 76 views
0

我一直很需要SQL字符串列上的最大长度。有一些数据没有真正的最大长度。例如,假设您有一个字段来存储某人的名字,并且您将其设为NVARCHAR(50)。总是有可能的(尽管极不可能)某个人的名字长于50个字符。nvarchar实时更改最大文件大小

在飞行中改变场的最大长度是否可行?我的意思是,当你做一个INSERT/UPDATE时,你需要检查这个人的姓名是否超过50个字符,如果需要,你可以在INSERT/UPDATE之前检查ALTER。 (或者,如果需要的话,可以捕捉异常并执行ALTER)。

如果表中有很多数据,那么ALTER会是一个缓慢的操作?

假设您将列更改为NVARCHAR(100)。这张桌子上的SELECT会比从一开始就制作NVARCHAR(100)慢吗?

+3

即时更改数据库架构是一个糟糕的主意。将字段设置为合理的大小,并让代码负责验证输入。 –

+0

选择好的默认值。这个线程的问题有一些深思熟虑的答案:http://stackoverflow.com/questions/919871/how-big-do-you-make-your-nvarchar – dcaswell

+0

你正在使用哪些DBMS?甲骨文? Postgres的?另一种选择是尽可能长地定义列,然后使用检查约束来确保业务规则得以保留。更改检查约束不会对数据进行任何物理更改 –

回答

2

从使用nvarchar(),我猜你正在使用SQL Server。

在SQL Server中,我通常只是提出这样的名称varchar(255)(或nvarchar(255))。这实际上是一个与2的幂相关的奇怪时间错误(255 =最大的8位无符号值)。但它在实践中效果很好。

SQL Server中至少有两个注意事项。首先,字符串的最大“非最大”长度为8000个数据字节,即varchar(8000)nvarchar(4000)。这些也是合理的最大长度。

第二个考虑因素是索引中键的长度。最大长度是900字节。如果你在该领域有一个索引,那么你不希望这个领域比这长。如果你有复合索引,那么255似乎是一个合理的长度。

但是,关键点在于,改变字段的长度可能会产生您没有想到的效果,例如在索引上。你不想轻易改变表格的结构。相反,只要让该领域超大型开始,并完全忘记了这个问题。

+0

请注意,对于某些操作(如散列和排序),SQL Server会估计平均值。数据大小为列长度/ 2 ...这是可怕的。 nvarchar(4000)出错。 – usr