知识点001
当变量的数据类型为VARCHAR时,变量赋值后,变量中的字符所占字节数,数字和字母是1个bytes,汉字是2个bytes;
当变量的数据类型为NVARCHAR时,变量赋值后,变量中的字符所占字节数,数字、字母和汉字,均为2个bytes.
知识点002
假定变量的数据类型是VARCHAR(N) ,含义是它能存储的变量长度是N个bytes(注意,不是bit)
例如SQL语句:DECLARE name VARCHAR(10), 指变量name的长度是10个字节。
我们知道,一个汉字占2个bytes,假如我们设计一个驾校管理系统,设计数据库的时候,将数据表字段name的数据类型设为VARCHAR(10)
10个字节,最多只能保存5个汉字,如果系统需要保存的人名长度大于5个汉字(比如俄罗斯总统普京,全名【弗拉基米尔·弗拉基米罗维奇·普京】,14个汉字,2个·字符),系统就会出问题。
值得注意的是,下面这个数据类型的长度问题。
假定变量的数据类型为NVARCHAR(N),含义是它能存储的变量长度是(2*N)个bytes.
SQL代码验证。
1 --汉字 2 CREATE TABLE dbo.Test1 (c1 NVARCHAR(4)); 3 INSERT dbo.Test1 VALUES ('美人她爹'); 4 SELECT DATALENGTH(c1) AS Bytes_of_Column_C1 FROM dbo.Test1; 5 6 CREATE TABLE dbo.Test2 (c2 VARCHAR(8)); 7 INSERT dbo.Test2 VALUES ('美人她爹'); 8 SELECT DATALENGTH(c2) AS Bytes_of_Column_C2 FROM dbo.Test2;
执行结果:
1 --数字 2 CREATE TABLE dbo.Test3 (c3 NVARCHAR(4)); 3 INSERT dbo.Test3 VALUES ('1234'); 4 SELECT DATALENGTH(c3) AS Bytes_of_Column_C3 FROM dbo.Test3; 5 6 CREATE TABLE dbo.Test4 (c4 VARCHAR(8)); 7 INSERT dbo.Test4 VALUES ('12345678'); 8 SELECT DATALENGTH(c4) AS Bytes_of_Column_C4 FROM dbo.Test4;
执行结果:
1 --字母 2 CREATE TABLE dbo.Test5 (c5 NVARCHAR(4)); 3 INSERT dbo.Test5 VALUES ('abcd'); 4 SELECT DATALENGTH(c5) AS Bytes_of_Column_C5 FROM dbo.Test5; 5 6 CREATE TABLE dbo.Test6 (c6 VARCHAR(8)); 7 INSERT dbo.Test6 VALUES ('abcdefgh'); 8 SELECT DATALENGTH(c6) AS Bytes_of_Column_C6 FROM dbo.Test6;
执行结果: