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

问题描述 投票:0回答:6

我需要将数据库表中的列数据类型从

varchar
更改为
nvarchar
以支持中文字符(目前,包含这些字符的
varchar
字段仅显示问号)。

我知道如何更改这些值,但我想看看这样做是否安全。换衣服之前有什么需要注意的吗?谢谢!

sql sql-server sql-server-2005 sqldatatypes
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

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


10
投票

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


5
投票

桌子会变大。列中的每个字符将占用两倍的空间来存储。除非桌子真的很大,否则你可能不会注意到。

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


5
投票

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


2
投票

使用 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
© www.soinside.com 2019 - 2024. All rights reserved.