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

时间:2019-03-11 06:26:20

标签: mysql sql sql-server tsql nvarchar

我刚刚将表中的nvarchar(MAX)字段更改为nvarchar(250)。 有人可以告诉我,如果输入的字符数超过250个,会如何处理?

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

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

2 个答案:

答案 0 :(得分:3)

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

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

  

Msg 8152,级别16,状态13,第12行字符串或二进制数据为   被截断。该声明已终止。

如果更改列长,如果SET ANSI_WARNINGS OFF,则SQL Server将在没有任何警告的情况下更改列长,并且多余的数据将被截断。

默认情况下,警告用户SET ANSI_WARNINGS ON

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

答案 1 :(得分:0)

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

取决于DBMS和版本,您甚至可能无法更改列长。

但是,如果您没有说超过250行的话,那应该没有问题。

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

顺便提一句,无论您打算如何进行此更改,我都建议避免使用可变长度的列

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