SQL Server中的nchar,nvarchar,text,ntext,char,varchar比较

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介:

参考文献:

http://www.cnblogs.com/mekong/archive/2009/04/17/1437996.html

http://msdn.microsoft.com/en-us/library/ms186939.aspx

前言

这几天在查阅sql server collation的问题,这其中就牵涉到了unicode,non-unicode,varchar,nvarchar,ANSI等字符编码的问题。首先我们讲解一些基础背景知识

定长或变长

所谓定长就是长度固定的,当输入的数据长度没有达到指定的长度时将自动以英文空格在其后面填充,使长度达到相应的长度;有var前缀的,表示是实际存储空间是变长的,比如varchar,nvarchar变长字符数据则不会以空格填充,比较例外的是,text存储的也是可变长。

Unicode或non-Unicode

数据库中,英文字符只需要一个字节存储就足够了,但汉字和其他众多非英文字符,则需要两个字节存储。如果英文与汉字同时存在,由于占用空间数不同,容易造成混乱,导致读取出来的字符串是乱码。Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。而前缀n就表示Unicode字符,比如nchar,nvarchar,这两种类型使用了Unicode字符集。

至于为什么英文字幕是一个字符,占用一个字节,而汉字是两个字符,占用两个字节。这是因为英文字幕只有26个,一个字节有8位,对应着有2^8=256种编码对应,远大于26,因此可以用一个字节来存储。但是汉字的数量远远大于一个字节所能对应的编码数量,所以必须使用两个字节,也就有了2^16=65536种编码对应每一个汉字。在unicode字符集中,汉字占了5万多个。

字段容量

接下来我们看一下char,varchar,nchar和nvarchar能存储多个内容,如下表所示:

char,varchar 最多8000个英文,4000个汉字
nchar,nvarchar 可存储4000个字符,无论英文还是汉字

分析1:

之索引是8000,是因为在sqlserver中一个page是8kb,而用于存储行数据的只有8060字节。这四种数据类型用于修饰表中的一个列,所以列的长度肯定不能大于8060,剩下的60字节具体做什么还不清楚。

分析2:

varchar是按字节存储的,而nvarchar是按字符存储的 。比如说 , varchar(40),能存储40个字节长度的字符,存储中文字符的时候,因为中文字符1个字符就等于2个字节。所以varchar(40)只能存储20个中文字符。nvarchar(40),就可以存储40个中文字符,但是它所占用的存储空间是80字节,但是还是只能存储40个英文字符。

实验说明:

复制代码
--实验1:测试nvarchar和varchar的存储长度
--创建一个默认collation为Chinese_PRC_CI_AS的数据库TESTDB3
USE TESTDB1
CREATE TABLE test
(
  lastname        NVARCHAR(8) NOT NULL,--nvarchar类型,双字节存储
  title           VARCHAR(8) NOT NULL, --varchar类型,单字节存储
);
insert into test values('姓名1','标题1');
select * from test;
insert into test values('123456789','1');--String or binary data would be truncated.
insert into test values('12345678','1');
insert into test values('1','12345678');
insert into test values('一二三四五六七八','一二三四');
select * from test;

--总结:
/*
1.nvarchar(n),按字符来存储,不论是英文字符还是中文字符。最多能够存储n个中文或者是英文,但是所占用的存储空间是2n+2个字节。1<=n<=4000
2.varchar(n)按字节存储,最多能够存储n个英文字母,存储n/2个中文字符。但是所占用的存储空间是n个字节。1<=n<=8000
*/
复制代码

CHAR 和 VARCHAR

CHAR

  • 存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间。

VARCHAR

  • 存储变长数据,但存储效率没有CHAR高,如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+2。为什么"+2"呢?这一个字节用于保存实际使用了多大的长度。这个可以在MSDN上找到:

varchar [ ( n | max ) ]

Variable-length, non-Unicode string data. n defines the string length and can be a value from 1 through 8,000. max indicates that the maximum storage size is 2^31-1 bytes (2 GB). The storage size is the actual length of the data entered + 2 bytes

因此,从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。

TEXT、NCHAR、NVARCHAR、NTEXT

TEXT

  • text存储可变长度的非Unicode数据,最大长度为2^31-1(2,147,483,647)个字符,2GB。

NCHAR、NVARCHAR、NTEXT

  • 这三种从名字上看比前面三种多了个"N"。和char、varchar比较起来,nchar、nvarchar最多存储4000个字符,不论是英文还是汉字;而char、varchar最多能存储8000个英文,4000个汉字。可以看出使用nchar、nvarchar数据类型时不用担心输入的字符是英文还是汉字,较为方便,但在存储英文时数量上有些损失。

 

所以一般来说,如果含有中文字符,用nchar/nvarchar,如果纯英文和数字,用char/varchar


本文转自xwdreamer博客园博客,原文链接:http://www.cnblogs.com/xwdreamer/archive/2012/07/11/2297139.html,如需转载请自行联系原作者


相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
存储 关系型数据库 MySQL
面试时被这样一个问:”存储MD5值应该用VARCHAR还是用CHAR?
一个5年工作经验的小伙伴,在面试的时候被这样一个问题。说”存储MD5值应该用VARCHAR还是用CHAR“,他一时间不只如何选择,感觉用VARCHAR也可以,用CHAR也行。希望我来帮忙分析一下。
122 0
|
2月前
|
SQL 存储 关系型数据库
SQL判断CHAR类型字段不为空的方法与技巧
在SQL查询中,判断一个CHAR类型字段是否不为空是一个常见的需求
|
2月前
|
SQL 存储 数据采集
sql中varchar转number时报错怎么解决
通过上述策略的综合运用,面对VARCHAR到NUMBER的转换挑战,不仅能够游刃有余地解决现有的问题,更能前瞻性地预防未来的隐患。在数字化转型的浪潮中,凭借其高性能、安全稳定的云产品与服务,为各类企业级应用保驾护航,助您轻松驾驭数据的海洋,实现业务的无缝扩展与全球布局。
43 0
|
4月前
|
存储 SQL 自然语言处理
|
4月前
|
存储 数据管理 数据库
|
4月前
|
存储 SQL 数据库
|
5月前
|
存储 SQL C++
对比 SQL Server中的VARCHAR(max) 与VARCHAR(n) 数据类型
【7月更文挑战7天】SQL Server 中的 VARCHAR(max) vs VARCHAR(n): - VARCHAR(n) 存储最多 n 个字符(1-8000),适合短文本。 - VARCHAR(max) 可存储约 21 亿个字符,适合大量文本。 - VARCHAR(n) 在处理小数据时性能更好,空间固定。 - VARCHAR(max) 对于大文本更合适,但可能影响性能。 - 选择取决于数据长度预期和业务需求。
448 1
|
7月前
|
存储 关系型数据库 MySQL
MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%🚀
本篇文章来讨论MySQL字段的字符类型选择并深入实践char与varchar类型的区别以及在千万数据下的性能测试
MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%🚀
|
存储 SQL 数据库
char、varchar、nvarchar、text的区别
char、varchar、nvarchar、text的区别
102 0
|
7月前
|
存储 机器学习/深度学习 关系型数据库
mysql中char和varchar的区别
mysql中char和varchar的区别
193 1