繁体   English   中英

在数据库中将nvarchar(MAX)更改为nvarchar(n)

[英]Changing nvarchar(MAX) to nvarchar(n) in database

我刚刚将表中的nvarchar(MAX)字段更改为nvarchar(250)。 如果有超过250个字符的条目,有人可以告诉我数据会发生什么变化吗?

我关心的不是可见数据,而是幕后发生的事情:

  • 对超过该容器数据限制的数据做了什么?
  • 我在几个地方读到必须删除该表并重新创建。 这是真的吗?为什么? 我没有看到其他人收到的任何错误。
  • 有没有办法在进行此更改后恢复截断的数据? (我不想这样做,但我很好奇)

如果您已将列nvarchar(MAX)字段更改/更改为nvarchar(250)并且您没有收到任何错误,则表示行上没有包含超过250个字符的数据,这就是SQL Server成功更改列长度和数据的原因准确/完整。

如果任何行包含超过250个字符,那么SQL服务器将给您一个错误,并且alter语句将失败。 这意味着不会更改数据类型长度。

消息8152,级别16,状态13,行12字符串或二进制数据将被截断。 该语句已终止。

如果SET ANSI_WARNINGS OFF则更改列长度,然后SQL Server将更改列长度而不发出任何警告,并且将截断额外数据。

默认情况下,它是SET ANSI_WARNINGS ON以警告用户。

我认为一旦数据被截断,以后就无法恢复。

如果任何行超过新长度,系统应该阻止您或至少警告您在更改列长度时可能丢失数据。

根据DBMS和版本,您甚至可能无法更改列长度。

但是,如果你没有超过250的行,正如你所说,那么应该没有问题。

除非您可以访问更改之前的数据库备份,否则无法恢复截断的数据

在旁注中,无论您打算如何处理该更改,我都应该建议避免使用可变长度的列

MySQL会自动为可变长度列保留最大可能长度,无论行是15个字符还是45个或250个。这可以想象,最终会导致系统出现瓶颈。 (也许你没有一个足够大的数据库来显示效果,但我的座右铭是“预先警告是预先设定的”)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM