Sql nvarchar动态更改最大大小

Sql nvarchar动态更改最大大小,sql,Sql,我一直为SQL字符串列的最大长度的需要而烦恼。有些数据没有真正的最大长度。例如,假设您有一个字段来存储某人的名字,并将其设置为NVARCHAR(50)。一个人的名字超过50个字符总是有可能的(尽管可能性很小) 在飞行中更改场地的最大长度是否可行?我的意思是,当您执行INSERT/UPDATE时,您会检查此人的姓名是否超过50个字符,并在执行INSERT/UPDATE之前根据需要更改表。(或者,如果需要,捕获异常并执行ALTER) 如果表中有大量数据,ALTER会是一个缓慢的操作吗 假设您将列更改

我一直为SQL字符串列的最大长度的需要而烦恼。有些数据没有真正的最大长度。例如,假设您有一个字段来存储某人的名字,并将其设置为
NVARCHAR(50)
。一个人的名字超过50个字符总是有可能的(尽管可能性很小)

在飞行中更改场地的最大长度是否可行?我的意思是,当您执行
INSERT/UPDATE
时,您会检查此人的姓名是否超过50个字符,并在执行
INSERT/UPDATE
之前根据需要更改表。(或者,如果需要,捕获异常并执行
ALTER

如果表中有大量数据,
ALTER
会是一个缓慢的操作吗


假设您将列更改为
NVARCHAR(100)
。从这个表中选择
会比从一开始就选择
NVARCHAR(100)
慢吗?

NVARCHAR()
的使用来看,我猜您使用的是SQL Server

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

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

第二个考虑因素是索引中键的长度。最大长度为900字节。如果字段上有索引,则不希望字段长度超过此值。如果您有复合索引,那么255似乎是一个合理的长度


然而,关键的一点是,更改字段的长度可能会产生您没有想到的影响,例如对索引的影响。您不希望轻易更改表的结构。取而代之的是,首先将字段设置得过大,然后完全忘记这个问题。

通过使用
nvarchar()
,我猜您使用的是SQL Server

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

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

第二个考虑因素是索引中键的长度。最大长度为900字节。如果字段上有索引,则不希望字段长度超过此值。如果您有复合索引,那么255似乎是一个合理的长度


然而,关键的一点是,更改字段的长度可能会产生您没有想到的影响,例如对索引的影响。您不希望轻易更改表的结构。相反,一开始就将字段设置得过大,然后完全忘记这个问题。

动态更改数据库模式是一个糟糕的主意。使字段尽可能大,并让您的代码负责验证输入。选择好的默认值。这个线程问题有一些深思熟虑的答案:您使用的是哪种DBMS?神谕博士后?另一个选项是尽可能长地定义列,然后使用检查约束确保业务规则得到保留。更改check约束不会对数据进行任何物理更改动态更改数据库模式是一个糟糕的想法。使字段尽可能大,并让您的代码负责验证输入。选择好的默认值。这个线程问题有一些深思熟虑的答案:您使用的是哪种DBMS?神谕博士后?另一个选项是尽可能长地定义列,然后使用检查约束确保业务规则得到保留。更改检查约束不会对dataNote施加任何物理更改,对于某些操作(如哈希和排序),SQL Server将平均数据大小估计为columnlength/2。。。这太可怕了。nvarchar(4000)出错。请注意,对于哈希和排序等操作,SQL Server估计平均数据大小为columnlength/2。。。这太可怕了。nvarchar(4000)出现错误。