Varchar 到 nvarchar 不改变长度

Varchar to nvarchar without changing length

我有这个 table 为类型为 varchar(255)、sql 服务器的 sub_id 列中的每一行存储一个 ID。其他列存储 unicode,因此它们是 nvarchar。现在出于某种原因,我需要将 sub_id 更新为 nvarchar。我 运行 以下命令:

 ALTER TABLE TABLE_NAME ALTER COLUMN SUB_ID NVARCHAR(255)

这更改了列类型但将长度设置为 510。我不想更改列的长度。如果我必须提到,table 有很多数据,sub_id 的长度永远不会超过 20。

我读到了这篇文章,但不知道如何截断列的长度。

以下是 sp_help 上提到的 table 的快照(subject_id 是 sub_id)

NVARCHAR的大小是255,每个字符占space的2个字节,所以DATALENGTH显示为510

DECLARE @string NVARCHAR(20)  
SET @string = 'Robin'  
SELECT @string AS 'String', DATALENGTH(@string) AS 'Datalength' , LEN(@string) AS 'Len' 

如上面的输出所示,您将观察到 DATALENGTH 列仅显示 10 作为值。那是因为每个字符占用space2个字节,而数据长度只有5个字符,所以在数据库中会占用space10个字节。

当您查看 sp_help 时,长度表示以下 (sp_help (Transact-SQL)):

Length smallint Physical length of the data type (in bytes).

不是指列的字符长度。

单个 nvarchar 字符的大小为 2 个字节,而不是一个。列的最大长度没有改变,但它的字节大小改变了。

如果您希望该列的 数据大小 保持不变,您必须将该列设为 nvarchar(127)/nvarchar(128)(这大小为 254/256 字节),并且会截断您的值。