谈谈char ,nchar,varchar,nvarchar 和Uniqueidentifier
在SQL server数据库中这几个类型应该是比较常用的,这篇文章主要也是和大家一起讨论下这几个类型。
先重点看前面4个:char ,nchar,varchar,nvarchar
Msdn解释如下:
固定长度或可变长度的字符数据类型。
char [ ( n ) ]
固定长度,非 Unicode 字符数据,长度为 n 个字节。n 的取值范围为 1 至 8,000,存储大小是 n 个字节。char 的 ISO 同义词为 character。
varchar [ ( n | max ) ]
可变长度,非 Unicode 字符数据。n 的取值范围为 1 至 8,000。max 指示最大存储大小是 2^31-1 个字节。存储大小是输入数据的实际长度加 2 个字节。所输入数据的长度可以为 0 个字符。varchar 的 ISO 同义词为 char varying 或 character varying。
字符数据类型(nchar 长度固定,nvarchar 长度可变)和 Unicode 数据使用 UNICODE UCS-2 字符集。
nchar [ ( n ) ]
n 个字符的固定长度的 Unicode 字符数据。n 值必须在 1 到 4,000 之间(含)。存储大小为两倍 n 字节。nchar 的 ISO 同义词为 national char 和 national character。
nvarchar [ ( n | max ) ]
可变长度 Unicode 字符数据。n 值在 1 到 4,000 之间(含)。max 指示最大存储大小为 2^31-1 字节。存储大小是所输入字符个数的两倍 + 2 个字节。所输入数据的长度可以为 0 个字符。nvarchar 的 ISO 同义词为 national char varying 和 national character varying。
var->vary(变化),所以带有var 的类型都是可变长度的。
n->national(国际化),因为UTF8不足够表示中文,韩文,日文,所以为了支持国际化,有了Unicode的编码,所以以n开头的字段代表着这个类型是unicode编码。
实例演示:
创建表:
CREATE TABLE [dbo].[TestTable](
[char_Col] [char](5) NULL,
[nchar_Col] [nchar](5) NULL,
[nvarchar_Col] [nvarchar](5) NULL,
[varchar_Col] [varchar](5) NULL,
) ON [PRIMARY]
上面的n都是5,代表长度是5.
接着插入一行数据:
insert into TestTable select '1','1','1','1'
如果查看表可以看到:
仔细的数一数可以发现后面是4个空格,nchar_Col也是4个空格。这点说明对于定长类型char,nchar如果长度不足的话,在后面补充空格。
因为带有var,所以长度变了,后面不会有空格。
结论:使用长度固定的类型的时候,可能要做Trim操作,当然也可以选择RTrim,因为是在后面补充空格的。
2:执行下面的Sql语句:
insert into TestTable(char_Col,nchar_Col,nvarchar_Col,varchar_Col)
values('王王王王王','王王王王王','王王王王王','王王王王王')
结果如下:
char和varchar的长度是5,但是它们存储的是非Unicode字符,采用一个字节的形式来存储数据。
Nchar 和nvarchar 的长度也是5,但是存储的是Unicode字符,采用两个字节来存储数据,也就是是说对于任何字符,都采用两个字节来存储,不管是数字还是字母,或者是英文,总之任何字符都采用两个字节来储存。
在上面的例子中,”王”是中文,所有的中文都用两个字节表示,
所以上面的Sql语句就代表 select 10个字节,10个字节,10个字节,10个字节。
我们的表定义设置了所以的n为5,这里n是类型(n) 中的n。
char(5):存储5个字节,对于10个字节来说需要截断。
nchar(5):存储的是5*2个字节,对于10个字节来说,合适
varchar(5) :存储5个字节,对于10个字节来说需要截断。
nvarchar(5):存储的是5*2个字节,对于10个字节来说,合适
为了验证:执行下面的sql语句
insert into TestTable(char_Col,nchar_Col,nvarchar_Col,varchar_Col)
values('王王a','12345','王王王王王','12345')
结果:
一个中文2个字符,所以’王王a’ 一共5个字符。
修改代码为:
insert into TestTable(char_Col,nchar_Col,nvarchar_Col,varchar_Col)
values('王王a','123456','王王王王王','12345')
和上面的不同是将nchar_Col加了个6.
结果:
为什么?
nchar是存储Unicode字符的,所以不管任何字符,都采用两个字节来存储。”123456” 的长度是6,所以需要的字节是6*2=12个字节,对于nchar(5) 只能存储10个字节来说”123456” 会被截断。
这里就是要注意对于nchar,nvarchar 来说,这两个数据类型是用来存储Unicode的,所以任何字符都采用两个字节来存储,也就是nchar(n),nvarchar(n) 中的n代表的就是字符串的长度。
N=5,所以可以存储”12345”,’王王王王5”,” 王王王王王”,” 王ade1”,这些字符串的长度都是5
但是对于char(n),varchar(n) 来说,n代表的是字节。
例如
N=5,所以可以存储”12345”,”王王a”,”ab王d”.一个汉字两个字节,这些字符串的字节全部都是5
关于何时使用char,varchar,nchar,nvarchar,msdn给了一部分建议:
· 如果列数据项的大小一致,则使用 char。
· 如果列数据项的大小差异相当大,则使用 varchar。
· 如果列数据项大小相差很大,而且大小可能超过 8,000 字节,请使用 varchar(max)。
· 如果需要支持Unicode,使用nchar,nvarchar
在早期的Sql Server 版本中,如果要存储大量的字符串,可以采用ntext,text,image 数据类型,不过微软建议:
Uniqueidentifier:16字节GUID
如果应用程序要使用guid来作为表的id的话,你会选择什么数据类型?
char(36) ,nchar(36), varchar(36), nvarchar(36) 还是uniqueidentifier
假设guid为xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,长度是36.
很明显,你不会选择nchar(36),nvarchar(36).因为guid不会有中文,而且nchar(36),nvarchar(36)代表着72个字节。
其次你应该不会选择varchar(36),因为一个guid不做处理的话,长度是固定的。
剩下来就是char(36) 和uniqueidentifier之争了
Uniqueidentifier需要16字节GUID,char(36) 需要36个字节,你会选择什么数据类型?
为什么Uniqueidentifier 16个字节就可以存储guid?
msdn 解释:
通过从 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 形式的字符串常量进行转换,其中,每个 x 都是 0-9 或 a-f 范围内的十六进制数字。例如,6F9619FF-8B86-D011-B42D-00C04FC964FF 为有效的 uniqueidentifier 值。
谈谈char ,nchar,varchar,nvarchar 和Uniqueidentifier相关推荐
- Sql Server char nchar varchar nvarchar 区别
一. 用快捷键Alt+F1 打开的表结构, 我们看到的length, nchar和nvarchar 需要除以2才是储存的真正长度 二 . 类型前缀的意思 1.有var前缀的,表示是实际存储空间是变长的 ...
- char nchar varchar nvarchar varchar2区别
char(n):长度不可变,长度为n个字节,非Unicode字符 nchar(n):长度不可变,长度为2n个字节,Unicode字符 varchar(n):长度可变,长度为n个字节,非Unicode字 ...
- SQL char,nchar,varchar,nvarchar区别与使用
1,char,varchar,nchar,nvarchar区别 1,CHAR:CHAR存储定长数据很方便,CHAR字段上的索引小笼包级高,比如定义char(10),name不论你存储的数据是否达到了1 ...
- CHAR,NCHAR,VARCHAR,NVARCHAR
Oracle 类型定义 存储长度是否固定 存储长度指定 存储长度限制 存储字符集及编码方式 CHAR 存储固定长度的字符串 可以用字节或字符来指定一个字符串的最大长度,显示指定如CHAR(length ...
- char/nchar/varchar/nvarchar/varchar2之间如何选择使用?
1.varchar: 可变长度的非 Unicode 字符数据,最长为 8,000 个字符. 2.nvarchar: 可变长度的 Unicode 字符数据, ...
- 在Oracle中CHAR,NCHAR,VARCHAR,VARCHAR2,NVARCHAR2这五种类型的区别
[在Oracle中CHAR,NCHAR,VARCHAR,VARCHAR2,NVARCHAR2这五种类型的区别 ] 1.CHAR(size)和VARCHAR(size)的区别 CHAR为定长的字段,最 ...
- char* 大小_SQL Server中char, nchar, varchar和nvarchar数据类型有何区别
当问及CHAR,VARCHAR,NCHAR和NVARCHAR这些数据类型之间的差异时,这个看似很简单,但有时您也会感到困惑. 要在数据库存储字符.数值和特殊字符可以使用这4种数据类型,那么这4种数据类 ...
- Sqlserver中char,nchar,varchar与Nvarchar的区别
1. char类型: 对英文(ASCII)字符占用1个字节,对一个汉字占用2个字节,CHAR存 储定长数据很方便,CHAR字段上的索引效率极高,比如定义char(10),那么不论你存储的数据是否达到了 ...
- mysql server nchar_Sqlserver中char,nchar,varchar与Nvarchar的区别分析
1. char类型: 对英文(ASCII)字符占用1个字节,对一个汉字占用2个字节,CHAR存储定长数据很方便,CHAR字段上的索引效率极高,比如定义char(10),那么不论你存储的数据是否达 到了 ...
最新文章
- 分享45款高质量的免费(X)HTML/CSS模板
- C语言加强学习营(二):定义整型的最大值和最小值
- LSTM 与 Bilstm介绍(包含代码实现、Python)
- 最爱的城市(dfs)
- 畅玩4x 刷linux,荣耀4x如何root
- 系列文章--WF学习资料汇总
- 使用OpenCV进行图片模糊处理(中值滤波)
- php mysql网页象棋源码_Android项目源码安卓联网中国象棋源码
- 深圳西丽车管所科目二驾考攻略
- PPT画图保存时自动压缩图片问题
- php验证码手册,验证码_专题_帮助文档_Thinkphp手册
- 百度地图缩放级别与比例尺的关系
- 浅谈《微信抢红包原理》
- 【Java 8 新特性】Java 8 时间接口示例:MonthDay、Month、OffsetDateTime 和 OffsetTime
- 不思议迷宫:逆向后的放置play
- 微信支付V3版开发中遇到的一个问题及原因:缺少prepay_id
- 什么是公网?什么是专网?
- Velodyne Lidar公布自动驾驶技术世界安全峰会的议程
- Robust官方文档介绍
- 仿墨迹24小时天气自定义View