关于SQLServer中的字符存储的问题的测试 -- 字符串前缀'N’

本文通过SQLServer2008环境下的测试,详细阐述了数据库中汉字和字母的存储机制,包括汉字的Unicode编码与ASCII编码的区别,以及在有无前缀‘N’情况下的存储差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

http://www.examda.com/ncre/three/db/fudao/20091221/102436529.html

 

  突然想到了数据库中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指定的长度,既是在限定字符数,也是在限定字节数。 

转载于:https://www.cnblogs.com/neru/archive/2011/09/26/2191716.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值