在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 varyingcharacter varying

字符数据类型(nchar 长度固定,nvarchar 长度可变)和 Unicode 数据使用 UNICODE UCS-2 字符集。

nchar [ ( n ) ]

n 个字符的固定长度的 Unicode 字符数据。n 值必须在 1 到 4,000 之间(含)。存储大小为两倍 n 字节。nchar 的 ISO 同义词为 national charnational character

nvarchar [ ( n | max ) ]

可变长度 Unicode 字符数据。n 值在 1 到 4,000 之间(含)。max 指示最大存储大小为 2^31-1 字节。存储大小是所输入字符个数的两倍 + 2 个字节。所输入数据的长度可以为 0 个字符。nvarchar 的 ISO 同义词为 national char varyingnational 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 数据类型,不过微软建议:

Uniqueidentifier16字节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相关推荐

  1. Sql Server char nchar varchar nvarchar 区别

    一. 用快捷键Alt+F1 打开的表结构, 我们看到的length, nchar和nvarchar 需要除以2才是储存的真正长度 二 . 类型前缀的意思 1.有var前缀的,表示是实际存储空间是变长的 ...

  2. char nchar varchar nvarchar varchar2区别

    char(n):长度不可变,长度为n个字节,非Unicode字符 nchar(n):长度不可变,长度为2n个字节,Unicode字符 varchar(n):长度可变,长度为n个字节,非Unicode字 ...

  3. SQL char,nchar,varchar,nvarchar区别与使用

    1,char,varchar,nchar,nvarchar区别 1,CHAR:CHAR存储定长数据很方便,CHAR字段上的索引小笼包级高,比如定义char(10),name不论你存储的数据是否达到了1 ...

  4. CHAR,NCHAR,VARCHAR,NVARCHAR

    Oracle 类型定义 存储长度是否固定 存储长度指定 存储长度限制 存储字符集及编码方式 CHAR 存储固定长度的字符串 可以用字节或字符来指定一个字符串的最大长度,显示指定如CHAR(length ...

  5. char/nchar/varchar/nvarchar/varchar2之间如何选择使用?

    1.varchar:   可变长度的非    Unicode   字符数据,最长为    8,000    个字符.   2.nvarchar:   可变长度的    Unicode    字符数据, ...

  6. 在Oracle中CHAR,NCHAR,VARCHAR,VARCHAR2,NVARCHAR2这五种类型的区别

    [在Oracle中CHAR,NCHAR,VARCHAR,VARCHAR2,NVARCHAR2这五种类型的区别 ] 1.CHAR(size)和VARCHAR(size)的区别  CHAR为定长的字段,最 ...

  7. char* 大小_SQL Server中char, nchar, varchar和nvarchar数据类型有何区别

    当问及CHAR,VARCHAR,NCHAR和NVARCHAR这些数据类型之间的差异时,这个看似很简单,但有时您也会感到困惑. 要在数据库存储字符.数值和特殊字符可以使用这4种数据类型,那么这4种数据类 ...

  8. Sqlserver中char,nchar,varchar与Nvarchar的区别

    1. char类型: 对英文(ASCII)字符占用1个字节,对一个汉字占用2个字节,CHAR存 储定长数据很方便,CHAR字段上的索引效率极高,比如定义char(10),那么不论你存储的数据是否达到了 ...

  9. mysql server nchar_Sqlserver中char,nchar,varchar与Nvarchar的区别分析

    1. char类型: 对英文(ASCII)字符占用1个字节,对一个汉字占用2个字节,CHAR存储定长数据很方便,CHAR字段上的索引效率极高,比如定义char(10),那么不论你存储的数据是否达 到了 ...

最新文章

  1. 分享45款高质量的免费(X)HTML/CSS模板
  2. C语言加强学习营(二):定义整型的最大值和最小值
  3. LSTM 与 Bilstm介绍(包含代码实现、Python)
  4. 最爱的城市(dfs)
  5. 畅玩4x 刷linux,荣耀4x如何root
  6. 系列文章--WF学习资料汇总
  7. 使用OpenCV进行图片模糊处理(中值滤波)
  8. php mysql网页象棋源码_Android项目源码安卓联网中国象棋源码
  9. 深圳西丽车管所科目二驾考攻略
  10. PPT画图保存时自动压缩图片问题
  11. php验证码手册,验证码_专题_帮助文档_Thinkphp手册
  12. 百度地图缩放级别与比例尺的关系
  13. 浅谈《微信抢红包原理》
  14. 【Java 8 新特性】Java 8 时间接口示例:MonthDay、Month、OffsetDateTime 和 OffsetTime
  15. 不思议迷宫:逆向后的放置play
  16. 微信支付V3版开发中遇到的一个问题及原因:缺少prepay_id
  17. 什么是公网?什么是专网?
  18. Velodyne Lidar公布自动驾驶技术世界安全峰会的议程
  19. Robust官方文档介绍
  20. 仿墨迹24小时天气自定义View

热门文章

  1. GTA 5祖传「屎山」代码终于修复!R星认可黑客方案,还给他发了1万美元奖金
  2. 孙正义真会玩,这个「人不是人,狗不是狗」的画面,价值上千万
  3. Linux文件压缩与归档
  4. Linux如何解决动态库的版本控制
  5. Java 内存模型 与 高效并发
  6. 关于jsb中js与c++的相互调用
  7. 多行显示的UIButton
  8. 交换机无法ping通之谜
  9. 5G 在轨道运输网络中的需求
  10. KubeEdge — Overview