首页 > 常识 > 互联网 > 网站制作 > 数据安全

char,varchar,nvarchar 数据字段的区别

作者:  时间:2024-07-12
描述:区别是char(n)是定长的,varchar(n)是变长的。Char(n)会产生多余空格填充。
字段是用char,固定长度,要不你可以改成varchar,存多少就是多少长度。

这样把简介和正文字段都改为varchar‍应该可能减少不少数据库的大小。

测试仅把简介字段改为‍varchar‍,一个17MB的数据库直接变为1.X MB了,再测试下生成等有无问题。

‍Char,varchar,nvarchar字段是sql server数据库中的三种字段类型。好多人在选择存储的时候不知道如何抉择,我给大家讲下这个三个字段类型的区别。

Char(n)是长度为n个字节的定长的非unicode的字符数据。N为一个介于1到8000之间的值。其存储大小为输入数据的实际字节长度,而不是n个字节。如果你输入的实际字节长度少于n,那么其他位置会被空格填充。在数据存储中英文字母和数字占一个字节,汉字占两个字节。那么char(n)最多可以存储n个英文字母或数字,或者n/2个汉字。

Varchar(n)是长度为n个字节的可变长度且非 Unicode 的字符数据。n 必须是一个介于1 和8,000 之间的数值。存储大小为输入数据的字节的实际长度,而不是 n 个字节。注意它和char(n)的区别是char(n)是定长的,varchar(n)是变长的。如果你输入的字符的实际字节长度少于n,那么它的长度就是你实际输入的字节长度。在数据存储中英文字母和数字占一个字节,汉字占两个字节。Varchar(n)最多可以存储n个英文字母或数字,或者n/2个汉字。

Nvarchar(n) 包含 n 个字符的可变长度 Unicode 字符数据。n 的值必须介于 1 与 4,000 之间。字节的存储大小是所输入字符个数的两倍. 在数据存储中英文字母,数字,汉字都是占两个字节。Char(n)最多可以存储n个英文字母或数字,或者n个汉字。

在数据检索中,一般来说char型字段的数据是最快的,varchar,nvarchar型字段其次。

在所存数据长度不一的情况下,varcahr型字段所占空间最少,char,nvarchar其次。

那么到底在什么样的情况下使用什么样的数据类型呢?

如果你所存数据长度基本一致,建议使用char型。这样检索速度快,但是提取的时候要注意用trim()函数剔除所存数据两边的空格。

如果你所存数据长度差异较大,可以使用varchar或者nvarchar。如果你想较好的支持多语言的话,最好使用nvarchar。使用nvarchar可以减少字符转换问题,防止某些情况下乱码的出现。

下面列个表供大家参考。

 Char(n)
 Varchar(n)
 Nvarchar(n)
 
N
 8000
 8000
 4000
 
数据长度
 固定(不足用空格填充)
 可变(实际数据长度)
 可变(实际数据长度)
 
可存储最多英文(数字)
 8000
 8000
 4000
 
最多汉字数
 4000
 4000
 4000
 
英文(数字)所占字节
 1
 1
 2
 
汉字所占字节
 2
 2
 2
 
检索速度
 快
 慢
 慢

在去年的一个网站项目中,我使用了sql server数据库,数据库排序规则为Chinese_PRC_CI_AS.其中部分字段使用varchar型。

我在本机浏览数据库中数据正常,页面数据显示正常。但是当我将数据库导入到服务器以后,在客户端发现页面从数据库中读取的数据显示全是乱码。我通过查询分析器连接到服务器,发现数据库中的汉字也全变成了乱码。

我估计服务器端sql server为英文版,于是将服务器数据库中varchar型字段都改为nvarchar型,乱码问题解决。但是同时我又发现一个奇怪的现象。比如数据库中有两个记录。

表名: ComputerInfo

Computer        computerType  

成都家具厂        私营

合肥家具厂        私营

其中Computer字段为nvarchar型。我用 select * from ComputerInfo where Computer like ‘%成都%’   返回的记录数总是0.奇怪了,明明数据库中有数据的嘛。我查阅了大量的资料以后,终于解决了问题。只需要把查询语句改为select * from ComputerInfo where Computer like N‘%成都%’ 即可。在字符前加N表示将其转化为unicode字符。真让我有点哭笑不得。

PS:同事导入数据时使用的是nvarchar,可在查询的时候也出现文章里查询不到的情况,我用cast转换为varchar型,结果出现在是??,想到是因为字符集的原因,可导成txt之后再导入到数据库,结果还是一样查询不到。最后找到这篇文章,原来用个N就解决了,不过不知道为什么会这样子。

本文版权归原作者所有

从手机浏览器访问《生活宝典》

站内搜索
无相关信息
微商帮
世界网站大全
黄金期货谨慎隔夜持仓;黄金分割线与百分比线
黄金期货谨慎隔夜持仓
自己是否能够像自己想的那样做成一件事,身旁人的判断会比自己准确
自己是否能够像自己想
火宫殿:吃喝玩乐看,烧香拜神佛,红火的庙会经济
火宫殿:吃喝玩乐看,烧香
眼见为实也不为实,更须谨慎看到的并非全貌
眼见为实也不为实,更须