关于SQLServer中的字符存储的问题的测试

原创|其它|编辑:郝浩|2009-12-16 10:28:40.000|阅读 515 次

概述:突然想到了数据库中varchar和nvarchar以及字符串前缀'N'在实际应用中的问题,便做了一个小测试。测试的结论是我根据运行结果得出的。不完全正确,还请高手指点。

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

突然想到了数据库中varchar和nvarchar以及字符串前缀'N'在实际应用中的问题,便做了一个小测试。测试的结论是我根据运行结果得出的。不完全正确,还请高手指点。

测试环境:windows server 2003 sp2 + sqlserver 2008 rtm

以下为测试的SQL语句:

-- Create Table
USE DBUser;

IF OBJECT_ID('dbo.Test','U') IS NOT NULL
DROP TABLE dbo.Test;

CREATE TABLE dbo.Test
(
nvarStr
NVARCHAR(2) NULL,
varStr
VARCHAR(2) NULL,
rowNum
INT NULL
);

-- Get DataLength
SELECT length_DATALENGTH_1 = DATALENGTH('li');
SELECT length_DATALENGTH_2 = DATALENGTH('lili');
SELECT length_DATALENGTH_3 = DATALENGTH(N'li');
SELECT length_DATALENGTH_4 = DATALENGTH(N'lili');
SELECT length_DATALENGTH_5 = DATALENGTH('李培');
SELECT length_DATALENGTH_6 = DATALENGTH(N'李培');

-- INSERT Data
INSERT INTO dbo.Test(nvarStr,varStr,rowNum) VALUES('li','li',1);
INSERT INTO dbo.Test(nvarStr,varStr,rowNum) VALUES(N'li',N'li',2);

INSERT INTO dbo.Test(nvarStr,varStr,rowNum) VALUES('lili','li',3);
INSERT INTO dbo.Test(nvarStr,varStr,rowNum) VALUES(N'lili',N'li',4);

INSERT INTO dbo.Test(nvarStr,varStr,rowNum) VALUES('li','李培',5);
INSERT INTO dbo.Test(nvarStr,varStr,rowNum) VALUES(N'li',N'李培',6);

INSERT INTO dbo.Test(nvarStr,varStr,rowNum) VALUES('李培','li',7);
INSERT INTO dbo.Test(nvarStr,varStr,rowNum) VALUES(N'李培',N'li',8);

INSERT INTO dbo.Test(nvarStr,varStr,rowNum) VALUES('李培','李培',9);
INSERT INTO dbo.Test(nvarStr,varStr,rowNum) VALUES(N'李培',N'李培',10);

INSERT INTO dbo.Test(nvarStr,varStr,rowNum) VALUES('李培','',11);
INSERT INTO dbo.Test(nvarStr,varStr,rowNum) VALUES(N'李培',N'',12);

-- Query Data
SELECT * FROM dbo.Test;

---------------------------------------------------------

Get DataLength的结果为:

length_DATALENGTH_1:2
length_DATALENGTH_2:
4
length_DATALENGTH_3:
4
length_DATALENGTH_4:
8
length_DATALENGTH_5:
4
length_DATALENGTH_6:
4

由生成的结果可知:
在SQLServer2008中,对于汉字和英文字母的存储:
汉字:无论字符串前面是否加有前缀'N',都将中文隐式转换为有'N'的类型,即Unicode字符,因为只有UniCode字符才能表示中文,1个字符占2个字节(即1个汉字占2个字节)。
字母:有无前缀'N'的情况不同。当没有前缀'N'时,默认采用ASCII的方式编码,1个字符占1个字节(即1个字母占1个字节);当有前缀'N'时,则采用Unicode的方式编码,1个字符占2个字节(即1个字母占2个字节)。

INSERT Data的结果为:

nvarStr varStr rowNum
li li
1
li li
2
李培 li
7
李培 li
8
李培 李
11
李培 李
12

未插入行的报错信息皆为“将截断字符串或二进制数据”。
由此可推论出:
SQLServer对于插入数据库中数据的长度在两方面同时加以限制:一、设置的最大字符数;二、由最大字符数得到的相应类型的最大字节数。

由第2条插入语句的成功执行可推测出:
在某些情况下,即使英文字母前带有前缀'N',数据库引擎在执行插入时有可能将数据隐式转换成ASCII格式,以能够将数据插入到数据库。

 

因此,我们也可以知道,在创建表定义列时,为varchar和nvarchar指定的长度,既是在限定字符数,也是在限定字节数。


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:博客园

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP