关于SQLServer中的字符存储的问题的测试计算机等级考试

文章作者 100test 发表时间 2010:01:01 08:50:11
来源 100Test.Com百考试题网


  突然想到了数据库中varchar和nvarchar以及字符串前缀’N’在实际应用中的问题,便做了一个小测试。测试的结论是我根据运行结果得出的。不完全正确,还请高手指点。
  测试环境:windows server 2003 sp2(32bit) 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个字节)。源:www.examda.com
  字母:有无前缀’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指定的长度,既是在限定字符数,也是在限定字节数。

相关文章


净化网络环境加速IDC成长计算机等级考试
DNS剖析之内部构造篇计算机等级考试
家庭用无线路由器参考标准计算机等级考试
SQLServer数据存储与NTFS簇的大小计算机等级考试
关于SQLServer中的字符存储的问题的测试计算机等级考试
利用SQL05特性删除表中重复数据计算机等级考试
解密浏览器遭恶意篡改之谜计算机等级考试
重庆工商大学2010年上半年全国计算机等级考试(NCRE)报名时间计算机等级考试
长江师范学院2010上半年全国计算机等级考试报名时间计算机等级考试
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛