GVKun编程网logo

varchar和nvarchar SQL Server数据类型之间的主要性能差异是什么?(sql server中nvarchar和varchar的区别)

10

对于想了解varchar和nvarcharSQLServer数据类型之间的主要性能差异是什么?的读者,本文将提供新的信息,我们将详细介绍sqlserver中nvarchar和varchar的区别,并且

对于想了解varchar和nvarchar SQL Server数据类型之间的主要性能差异是什么?的读者,本文将提供新的信息,我们将详细介绍sql server中nvarchar和varchar的区别,并且为您提供关于2019-2-20Sqlserver数据库中char、varchar、nchar、nvarchar的区别及查询表结构、mysql中char、varchar、nvarchar数据类型的用法区别、MySQL中char、varchar和nvarchar的区别、mysql中char和varchar数据类型的区别是什么的有价值信息。

本文目录一览:

varchar和nvarchar SQL Server数据类型之间的主要性能差异是什么?(sql server中nvarchar和varchar的区别)

varchar和nvarchar SQL Server数据类型之间的主要性能差异是什么?(sql server中nvarchar和varchar的区别)

我正在使用,在我学校的小型Web应用程序的数据库上工作SQL Server 2005。
我对varcharvs的问题有两点看法nvarchar

  1. 使用varchar除非你处理了很多国际化的数据,然后使用nvarchar
  2. 只需使用nvarchar一切。
    我开始看到视图2的优点。我知道nvarchar确实占用了两倍的空间,但这并不一定是什么大问题,因为这只会存储数百名学生的数据。在我看来,最简单的方法就是不用担心它,只允许所有内容都使用nvarchar。还是我想念的东西?

答案1

小编典典

始终使用nvarchar。

对于大多数应用程序,您可能永远不需要双字节字符。但是,如果您需要支持双字节语言,并且数据库模式中仅支持单字节,那么回头修改整个应用程序确实非常昂贵。

将一个应用程序从varchar迁移到nvarchar的成本将比您在大多数应用程序中使用的额外磁盘空间少得多。

2019-2-20Sqlserver数据库中char、varchar、nchar、nvarchar的区别及查询表结构

2019-2-20Sqlserver数据库中char、varchar、nchar、nvarchar的区别及查询表结构

varchar 和 nvarchar区别:

varchar(n)
长度为 n 个字节的可变长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为输入数据的字节的实际长度,而不是 n 个字节。

nvarchar(n)
包含 n 个字符的可变长度 Unicode 字符数据。n 的值必须介于 1 与 4,000 之间。字节的存储大小是所输入字符个数的两倍。

两字段分别有字段值:我和coffee
那么varchar字段占2×2+6=10个字节的存储空间,而nvarchar字段占8×2=16个字节的存储空间。

如字段值只是英文可选择varchar,而字段值存在较多的双字节(中文、韩文等)字符时用nvarchar

上面是一个总结介绍,通过上面的介绍,可以知道。

varchar(4) 可以输入4个字线,也可以输入两个汉字

nvarchar(4) 可以输四个汉字,也可以输4个字母,但最多四个 

 

char、varchar 最多8000个英文、最多4000个汉字 (2G) 按字节存储

nchar、nvarchar 最多4000个字符  按字符存储

一个汉字==两个字节

一个标点符号==一个字节

一个字母==一个字节

一个字节==一个字符

ASCII==一个字节

(1)       定义:

 

char:    固定长度,存储ANSI字符,不足的补英文半角空格。

 

nchar:   固定长度,存储Unicode字符,不足的补英文半角空格

 

varchar:  可变长度,存储ANSI字符,根据数据长度自动变化。

 

nvarchar: 可变长度,存储Unicode字符,根据数据长度自动变化。

 

 

 

nvarchar(n) :包含 n个字符的可变长度 Unicode 字符数据。n 的值必须介于 1  与  4,000 之间。字节的存储大小是所输入字符个数的两倍。所输入的数据字符长度可以为零。

 

  varchar[(n)]:长度为 n 个字节的可变长度且非 Unicode的字符数据。n 必须是一个介于   1 和 8,000之间的数值。存储大小为输入数据的字节的实际长度,而不是 n 个字节。所输入的数据字符长度可以为零。

 

注意: ANSI主要是以单字节来存储数据,一般适合英文。而我们常用的汉字需要用两个字节来存储,所以就要使用unicode的数据类型,不然读取出来的数据可能会乱码。

 

(2)区别:

 

      ①从存储方式上,nvarchar是按字符存储的,而 varchar是按字节存储的;

 

      ②从存储量上考虑, varchar比较节省空间,因为存储大小为字节的实际长度,而 nvarchar是双字节存储;

 

      ③在使用上,如果存储内容都是英文字符而没有汉字等其他语言符号,建议使用varchar;含有汉字的使用nvarchar,因为nvarchar是使用Unicode编码,即统一的字符编码标准,会减少乱码的出现几率;

 

④   如果你做的项目可能涉及不同语言之间的转换,建议用nvarchar。

 

(3)优缺点:

 

   Nvarchar优点:判断字符串的时候可以不需要考虑中英文两种字符的差别,可以避免程序中乱码的问题。

 

           缺点:存储英文字符会增大一倍的存储空间.但是在存储代价已经很低廉的情况下,优先考虑兼容性会给你带来更多好处的,效率没有varchar高。

 

(4)为什么要用nvarchar?

 

    有n前缀的,n表示Unicode字符,即所有字符都占两个字节,nchar,nvarchar

 

字符中,英文字符只需要一个字节存储就足够了,但汉字众多,需要两个字节存储,英文与汉字同时存在时容易造成混乱,Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。

 

(5)有关var的简单介绍:

 

有var前缀的,表示是实际存储空间是变长的,varchar,nvarchar

 

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

 

(6)如何使用这些类型?

 

如果你肯定存储的数据长度,而且不包中文的,可以选择char类型。

 

如果肯定存储的数据长度,但可能包括中文,可以选择nchar类型。

 

如果不确定存储的数据长度,存储只有英文、数字的最好用varchar

 

如果不确定存储的数据长度,也有可能有中文,可以选择nvarchar类型,在SQL Server2005中也是比较常用的字符数据类型。

 

sqlserver 查找某个字段在哪张表里

select [name] from [库名].[dbo].sysobjects where id in(select id from [库名].[dbo].syscolumns Where name=''字段名'')

  查询表的字段说明

--查询表的字段说明
--use dataname -----数据库名
SELECT t.[name] AS 表名,c.[name] AS 字段名,cast(ep.[value] 
as varchar(100)) AS [字段说明]
FROM sys.tables AS t
INNER JOIN sys.columns 
AS c ON t.object_id = c.object_id
LEFT JOIN sys.extended_properties AS ep 
ON ep.major_id = c.object_id AND ep.minor_id = c.column_id WHERE ep.class =1 
AND t.name=''CN_PG''--------表名

  快速查看表结构(比较全面的)

--快速查看表结构(比较全面的)
SELECT CASE WHEN col.colorder = 1 THEN obj.name
ELSE ''''
END AS 表名,
col.colorder AS 序号 ,
col.name AS 列名 ,
ISNULL(ep.[value], '''') AS 列说明 ,
t.name AS 数据类型 ,
col.length AS 长度 ,
ISNULL(COLUMNPROPERTY(col.id, col.name, ''Scale''), 0) AS 小数位数 ,
CASE WHEN COLUMNPROPERTY(col.id, col.name, ''IsIdentity'') = 1 THEN ''√''
ELSE ''''
END AS 标识 ,
CASE WHEN EXISTS ( SELECT 1
FROM dbo.sysindexes si
INNER JOIN dbo.sysindexkeys sik ON si.id = sik.id
AND si.indid = sik.indid
INNER JOIN dbo.syscolumns sc ON sc.id = sik.id
AND sc.colid = sik.colid
INNER JOIN dbo.sysobjects so ON so.name = si.name
AND so.xtype = ''PK''
WHERE sc.id = col.id
AND sc.colid = col.colid ) THEN ''√''
ELSE ''''
END AS 主键 ,
CASE WHEN col.isnullable = 1 THEN ''√''
ELSE ''''
END AS 允许空 ,
ISNULL(comm.text, '''') AS 默认值
FROM dbo.syscolumns col
LEFT JOIN dbo.systypes t ON col.xtype = t.xusertype
inner JOIN dbo.sysobjects obj ON col.id = obj.id
AND obj.xtype = ''U''
AND obj.status >= 0
LEFT JOIN dbo.syscomments comm ON col.cdefault = comm.id
LEFT JOIN sys.extended_properties ep ON col.id = ep.major_id
AND col.colid = ep.minor_id
AND ep.name = ''MS_Description''
LEFT JOIN sys.extended_properties epTwo ON obj.id = epTwo.major_id
AND epTwo.minor_id = 0
AND epTwo.name = ''MS_Description''
WHERE obj.name = ''CN_PG''--表名
ORDER BY col.colorder ;

  表结构查询

--SQLServer根据表明查询表的外键关系
SELECT 主键列ID=b.rkey   
  ,主键列名=(SELECT name FROM syscolumns WHERE colid=b.rkey AND id=b.rkeyid)   
    ,外键表ID=b.fkeyid   
    ,外键表名称=object_name(b.fkeyid)   
    ,外键列ID=b.fkey   
    ,外键列名=(SELECT name FROM syscolumns WHERE colid=b.fkey AND id=b.fkeyid)   
    ,级联更新=ObjectProperty(a.id,''CnstIsUpdateCascade'')   
    ,级联删除=ObjectProperty(a.id,''CnstIsDeleteCascade'')   
FROM sysobjects a   
    join sysforeignkeys b on a.id=b.constid   
    join sysobjects c on a.parent_obj=c.id   
where a.xtype=''f'' AND c.xtype=''U''   
    and object_name(b.rkeyid)=''TABLE_PMD_TPP_TRAITS''

  

获取SqlServer中表结构 
 SELECT syscolumns.name,systypes.name,syscolumns.isnullable, syscolumns.length  
FROM syscolumns, systypes  
WHERE syscolumns.xusertype = systypes.xusertype 
 AND syscolumns.id = object_id(''你的表名'')

  

--单独查询表递增字段 select [name] from syscolumns where  id=object_id(N''你的表名'') and COLUMNPROPERTY(id,name,''IsIdentity'')=1

  

--获取表主外键约束 exec sp_helpconstraint   ''你的表名'' ;

  

mysql中char、varchar、nvarchar数据类型的用法区别

mysql中char、varchar、nvarchar数据类型的用法区别

mysql中char、varchar、nvarchar数据类型的用法区别 有需要的朋友可

说明:
1、char:
固定长度的非 Unicode 字符数据,最大长度为 8,000 个字符。
2、varchar:
可变长度的非 Unicode 数据,最长为 8,000 个字符。
3、nvarchar:
可变长度 Unicode 数据,其最大长度为 4,000 字符。
4、nchar
固定长度的 Unicode 数据,最大长度为 4,000 个字符。
5、char和varchar都是字符串类型的
用Unicode编码的字符串,结果是字符的整数值


如有以下数据结构:

工号 姓名 部门
———————–
1 张三 财务
2 李四 人事
3 王五 销售
……..

我们定义”姓名”为char(10)(静态)的时简单地用php代码表示:
简单地模拟底层数据存储链表$data

 代码如下 复制代码
$col_num_len  =1;      //工号长度为1
$col_name_len=10;    //姓名长度为10
$col_unit_len   =4;     //部门长度为4
$col_len=$col_num_len+$col_name_len+$col_unit_len+3;       

  //表示每笔记录的总长度,包括3个分隔符
实现如下:

 代码如下 复制代码

$data="1|张三      |财务|2|李四      |人事|3|王五      |销售|...";         //简单地模拟底层数据存储链表

//假设查找第2条记录的"姓名"字段数据
$record_start=$col_len*1+1;                                                       //获取第2行的起始位置
$record  =substr($data,$record_start,$col_len);                        //获取第2条记录
$col_name_start=$col_num_len+2;                                                   //获取"姓名"字段的起始位置
$col_name=substr($record,$col_name_start,$col_name_len);  //获取"姓名"字段的数据
echo $col_name;

-----------

 代码如下 复制代码
//假设更新第2条记录的"姓名"字段数据为"李小四"
$update_info="李小四";
$data=substr_replace($data,$update_info,$col_name_start,$col_name_len);        //更新字段,流程结束
而如果我们定义”姓名”字段为varchar(10)(动态)的时候情况则要复杂:
注意存储”姓名”的字段没有空格,这是char和varchar的存储区别
$col_num_len  =1;      //工号长度为1
$col_name_len=10;    //姓名长度为10
$col_unit_len   =4;     //部门长度为4
$col_len=$col_num_len+$col_name_len+$col_unit_len+3;

实现如下:

 代码如下 复制代码

//动态存放数据行的起始位置,数据为更新时生成(重新)
$record_1_start=1;$record_1_name_dynamic_len=4;                //$col_1_name_dynamic_len记录"姓名"动态字段的长度
$record_2_start=13;$record_2_name_dynamic_len=4;
$record_3_start=26;$record_3_name_dynamic_len=6;
...

$data="1|张三|财务|2|李四|人事|3|王小明|销售|...";                       //简单地模拟底层数据存储链表,注意存储"姓名"的字段没有空格

//假设查找第2条记录的"姓名"字段数据
$record_2_end=$record_3_start-1;                                               //获取第2行的结束位置
$record  =substr($data,$record_2_start,$record_2_end);         //获取第2条记录
$col_name_start=$col_num_len+2;                                                   //获取"姓名"字段的起始位置
$col_name=substr($record,$col_name_start,$record_2_name_dynamic_len);  //获取"姓名"字段的数据
echo $col_name;

//假设更新第2条记录的"姓名"字段数据为"李小四",这边比静态的复杂很多
$update_info="李小四";
$update_len=strlen($update_info);                //获取更新内容的长度
if($diff_len=$update_len-$record_2_name_dynamic_len)
{
$data=substr_replace($data,"",$col_name_start,$record_2_name_dynamic_len);        //清除原先数据
$record_2_name_dynamic_len=$update_len;                                                                        //更新字段的长度(并存储新值)

//在此假设总记录数为n
for($i=2;$i {
${''record_''.$i.''_start''}=${''record_''.$i.''_start''}+$diff_len;                                        //重新更新每个行的起始位置(并存储新值),系统开销大(实际上有不同的方法解决)
}
}

$data=substr_replace($data,$update_info,$col_name_start,0);


文中直接使用”substr_replace”,而在数据量很大的时候,底层实现上的开销也是不小的,在mysql中表现为(Row Migration)现象,在此不作赘述

根据以上的粗略实现证明:
1、varchar类型在更新环节上的系统开销是远大于char类型的。
2、两者间查找搜索性能上是不相上下的。
3、两者间的存储数据量($data)环节上,char要显示大于varchar。
4、大数据量提取时varchar的磁盘IO消耗更低,意味着varchar综合查询性能会更好。
5、没有了。

实际应用中的结论(如在mysql中):
1、char适合字段频繁更新时的应用。
2、varchar更节省磁盘空间。
3、实际应用中大数据量(多行)查询返回,varchar的查询性能比起char来要好出不少。
4、选择char和varchar会改变整体数据结构的算法以及存储方式。在mysql应用中,如已存在varchar字段,那么其它所有的char字段将以varchar方式存储。
5、没有了。

(以上算法仅以PHP简单描述,欢迎更好的思路加以指教)

注:此文原作者的写作时间比较久远了,所以有些地方和现在的有些出入,体现在:

1.在innodb引擎中,char和varchar的实现已无异,效率上并没多大区别。
2.选择char和varchar并不会改变整体数据结构的算法以及存储方式。(我记得这是在MYSQL4里的特性,网上的老文章有讲述,到了MYSQL5实测已无此特性)


总结分析:
文字字段若长度固定,如:身分证号码,就不要用 varchar 或 nvarchar,应该用 char 或 nchar。
支持多语言的站点应考虑使用 Unicode nchar 或 nvarchar 数据类型以尽量减少字符转换问题
文字字段若长度不固定,如:地址,则该用 varchar 或 nvarchar。除了可节省存储空间外,存取硬盘时也会较有效率

MySQL中char、varchar和nvarchar的区别

MySQL中char、varchar和nvarchar的区别

一、char和varchar的区别
char是固定长度的,而varchar会根据具体的长度来使用存储空间,另外varchar需要用额外的1-2个字节存储字符串长度。
1). 当字符串长度小于255时,用额外的1个字节来记录长度
2). 当字符串长度大于255时,用额外的2个字节来记录长度
比如char(255)和varchar(255),在存储字符串"hello world"时,char会用一块255个字节的空间放那个11个字符;而varchar就不会用255个,它先计算字符串长度为11,然后再加上一个记录字符串长度的字节,一共用12个字节存储,这样varchar在存储不确定长度的字符串时会大大减少存储空间。

二、varchar和nvarchar的区别
1. varchar(n):长度为n个字节的可变长度且非Unicode的字符数据。n必须是一个介于1和8,000之间的数值。存储大小为输入数据的字节的实际长度

2. nvarchar(n):包含n个字符的可变长度Unicode字符数据。n的值必须介于1与4,000之间。字节的存储大小是所输入字符个数的两倍。所输入的数据字符长度可以为零。

三、char和varchar的使用场景
1. 从字符长度的角度考虑:
(1). 长度较短的字段,使用char。如门牌号:101,201,...
(2). 固定长度的字段,使用char。如性别、身份证号、手机号等。(因为数据都是固定长度,varchar根据长度动态存储的特性就没作用了,而且还要占一个字节来存储长度)
(3). 字段的长度是否相近,如果某个字段其长度虽然比较长,但是其长度总是近似的,如一般在90个到100个字符之间,甚至是相同的长度。此时比较适合采用CHAR字符类型。

2. 从碎片角度考虑:
使用CHAR时,由于存储空间都是一次性分配的。从这个角度来讲,不存在碎片的困扰。而使用varchar时,因为存储的长度是可变的,当数据长度在更改前后不一致时,就不可避免地会出现碎片的问题。故使用varchar时,数据库管理员要时不时的对碎片进行整理。如执行数据库导出导入作业来消除碎片。

3. 即使使用Varchar数据类型,也不能够太过于慷慨。
虽然varchar可以自动根据长度调整存储空间,但是varchar(100)和varchar(255)还是有区别的:
假设它们都存储了90个字符的数据,那么它们在磁盘上的存储空间是相同的(硬盘上的存储空间是根据实际字符长度来分配存储空间的)。但对于内存来说,则不是这样的,内存是使用varchar中定义的长度(这里为100或255)的内存块来保存值。
所以如果某些字段会涉及到文件排序或者基于磁盘的临时表时,分配VARCHAR的长度时仍然不能过于慷慨,需要评估实际需要的长度,然后设置一个合适的长度,不能随意设置长度。

四、varchar和nvarchar的使用场景
1. nvarchar适用中文和其他字符,其中N表示Unicode编码,可以解决多语言之间的转换问题

参考:https://www.jb51.net/article/55366.htm

mysql中char和varchar数据类型的区别是什么

mysql中char和varchar数据类型的区别是什么

mysql中char和varchar数据类型的区别是:varchar类型用于存储可变长的字符串,char类型用于存储定长的字符串。varchar适用于字符串列的最大长度比平均长度大的情况,char适用于列的长度为定值的情况。

mysql中char和varchar数据类型的区别是什么

(推荐教程:mysql-tutorials.html" target="_blank">mysql教程)

mysql中char和varchar数据类型的区别是:

varchar类型用于存储可变长的字符串,是比较常见常用的字符串数据类型。

在存储的字符串是变长时,varchar更加节约空间。由于varchar是变长的,在使用update的时候,可能使得行变得比原来更长,这就导致需要做额外的工作。

如果一个行占用的空间增加,并且在页内没有多余的空间可与存储,这是innoDB的存储引擎需要分裂页来使行可以放进页内。

char类型用于存储定长的字符串。

在存储数据时,MySQL会删除所有文末的空格,所以,即便你存储的是:''abc '',注意这个字符串末尾是有空格的,也会在存储时把这个空格删掉。

我们来看一下使用场景:

varchar适用的场景:

  • 字符串列的最大长度比平均长度要大很多;

  • 字符串列的更新很少时,因为没有或很少有内存碎片问题;

  • 使用了UTF-8这样复杂的字符集,每个字符都使用不同的字节数进行存储;

char适用的场景:

  • 列的长度为定值时适合适用,比如:MD5密文数据。

以上就是mysql中char和varchar数据类型的区别是什么的详细内容,更多请关注php中文网其它相关文章!

今天关于varchar和nvarchar SQL Server数据类型之间的主要性能差异是什么?sql server中nvarchar和varchar的区别的讲解已经结束,谢谢您的阅读,如果想了解更多关于2019-2-20Sqlserver数据库中char、varchar、nchar、nvarchar的区别及查询表结构、mysql中char、varchar、nvarchar数据类型的用法区别、MySQL中char、varchar和nvarchar的区别、mysql中char和varchar数据类型的区别是什么的相关知识,请在本站搜索。

本文标签: