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 字节),并且会截断您的值。
我有这个 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 字节),并且会截断您的值。