Varchar nvarchar без изменения длины - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть эта таблица, в которой хранится идентификатор для каждой строки в столбце sub_id типа varchar (255), sql server. Другие столбцы хранят 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

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

Когда вы смотрите на sp_help, длина означает следующее ( sp_help (Transact-SQL) ):

Длина smallint Физическая длина типа данных ( в байтах ).

Это не означает длину столбца в символах.

Один nvarchar символ имеет размер 2 байта, а не один,Максимальная длина столбца не изменилась, но его размер в байтах изменился.

Если вы хотите, чтобы Размер данных столбца оставался неизменным, вам нужно сделатьстолбец nvarchar(127) / nvarchar(127) (который будет иметь размер 254/256 байт) и обрезает ваши значения.

1 голос
/ 06 ноября 2019

Размер 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 байтов пространства в базе данных.

...