一个常见的误解是认为CHAR(n)和VARCHAR(n),n定义了字符数。但是在CHAR(n)和VARCHAR(n)中,n定义了以字节为单位的字符串长度(0-8,000)。 n永远不会定义可以存储的字符数
根据Microsoft的此声明,我假设n是字符串的数据长度,当我们在varchar
中存储unicode字符时,单个字符应占用2个字节。但是,当我尝试以下示例时,我看到varchar
数据占用1个字节而不是2个字节。
declare @varchar varchar(6), @nvarchar nvarchar(6)
set @varchar = 'Ø'
select @varchar as VarcharString, len(@varchar) as VarcharStringLength, DATALENGTH(@varchar) as VarcharStringDataLength
有人可以解释其背后的原因吗?
我认为original quote有点混乱,继续进行
误解是因为使用单字节编码时,CHAR和VARCHAR的存储大小为n个字节,并且字符也是n。
但是因为它提到了encodings,所以我的猜测是该语句指向UTF encodings supported in SQL Server 2019及更高版本,这似乎允许(我尚未尝试)将Unicode存储在VARCHAR
列中。
declare @char varchar(4)
declare @nvarchar nvarchar(4)
Set @char = '@'
Set @nvarchar = '@'
select @char as charString,
LEN(@char) as charStringLength,
DATALENGTH(@char) as charStringDataLength
select @nvarchar as nvarcharString,
LEN(@nvarchar) as nvarcharStringLength,
DATALENGTH(@nvarchar) as nvarcharStringDataLength