将现有的 SQL Server 2005 数据库中的 varchar 数据类型更改为 nvarchar。有任何问题吗?

42
为了支持中文字符,我需要将数据库表中的列数据类型从varchar更改为nvarchar(目前,具有这些字符的varchar字段仅显示问号)。
我知道如何更改值,但我想知道在进行更改之前是否安全。在执行更改之前有什么需要注意的地方吗?谢谢!
6个回答

54
请注意,此更改是数据大小的更新,请参见SQL Server表列底层。此更改将添加一个新的NVARCHAR列,它将更新每一行,将数据从旧的VARCHAR复制到新的NVARCHAR列,然后将旧的VARCHAR列标记为已删除。如果表很大,则会生成大量日志,因此请做好准备。更新后,运行DBCC CLEANTABLE以回收以前使用的VARCHAR列所占用的空间。如果经济允许,最好运行 ALTER TABLE ... REBUILD ,这不仅可以回收空间,还可以完全删除已删除的物理VARCHAR列。链接文章开头有更多详细信息。
您可能还希望启用Unicode压缩以节省表空间。

50

您可以在非主键字段上执行:

ALTER TABLE [TableName]
ALTER COLUMN [ColumnName] nvarchar(N) null

在主键字段上它不起作用 - 您将需要重新创建表


2
或者删除再重新创建主键,以及任何引用它的外键。 - Gerry Coll

10

请确保长度不超过4000,因为VARCHAR的最大值是8000,而NVARCHAR只有4K。


默认情况下,nvarchar(MAX)的值与nvarchar(4000)的值完全相同,除非实际长度超过4000个字符;在这种情况下,行内数据将被替换为指向一个或多个单独页面的指针,其中存储了数据。NVARCHAR(MAX)可以容纳高达2GB的数据。 - Menelaos Vergis

5

检查此表的所有依赖项,如存储过程、函数、基于此表的临时表以及用于插入/更新的变量等,可能还需要更新为NVARCHAR。同时检查表是否在复制中!这可能会给您带来一系列新问题!


5
表格将变得更大。每个列中的字符需要两倍的空间来存储。除非表格非常大,否则您可能不会注意到这一点。

存储过程/视图/查询需要修改以处理nvarchar数据。


1
使用Remus的答案作为参考,这里是一个完整的脚本,它执行ALTER COLUMN,然后回收空间。请注意,在一台配备16 GB RAM的中档笔记本电脑上,对于一个具有超过500万条记录的表格,这个脚本运行时间不到5分钟。在我的桌面工作站和生产服务器上不到1分钟。
ALTER TABLE TableName ALTER COLUMN ColumnName nvarchar(250) not null

DBCC CLEANTABLE (DatabaseName, 'TableName', 100000)

ALTER TABLE TableName REBUILD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接