Varchar到nvarchar,不更改长度

问题描述 投票:-1回答:1

我有此表,用于在sql server varchar(255)类型的sub_id列中存储每一行​​的ID。其他列存储unicode,因此它们是nvarchar。现在由于某些原因,我需要将sub_id更新为nvarchar。我运行以下命令:

 ALTER TABLE TABLE_NAME ALTER COLUMN SUB_ID NVARCHAR(255)

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

我阅读了此内容,但无法弄清楚如何截断该列的长度。

下面是来自sp_help的有关表的快照(subject_id为sub_id)

enter image description here

sql-server database unicode alter-table nvarchar
1个回答
1
投票

NVARCHAR的大小为255,每个字符占用2个字节的空间,因此将DATALENGTH显示为510

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

enter image description here

与上面的输出一样,您将观察到DATALENGTH列仅显示10作为值。这是因为每个字符占用2个字节的空间,而数据长度只有5个字符,因此它将在数据库中占用10个字节的空间。


0
投票

[注视sp_help时,长度表示以下(sp_help (Transact-SQL)):

Length smallint数据类型的物理长度(以字节为单位)。

这并不意味着该列的长度以字符为单位。

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

如果您希望列的数据大小保持不变,则必须将列设置为nvarchar(127) / nvarchar(127)(大小为254/256字节),并将其截断您的价值观。

© www.soinside.com 2019 - 2024. All rights reserved.