SQL Server中的VARCHAR和NVARCHAR数据类型

关系数据库在表中表示组织的数据,这些表使用具有不同数据类型的列,允许它们存储有效值。开发人员和DBA需要知道并理解每一列的适当数据类型,以获得更好的查询性能。

本文将讨论流行的数据类型VARCHAR()和NVARCHAR()、它们的比较以及SQLServer 中的性能评估。

SQL中的VARCHAR[ ( n | max ) ]

该VARCHAR数据类型表示非Unicode可变长度的字符串的数据类型。您可以在其中存储字母、数字和特殊字符。

N表示以字节为单位的字符串大小。

VARCHAR数据类型列最多可存储8000个非Unicode字符。

VARCHAR数据类型每个字符占用1个字节。如果您没有明确指定N的值,则它需要1个字节的存储空间。

注意:不要将N与表示字符串中字符数的值混淆。

以下查询使用100个字节的数据定义VARCHAR数据类型。

SQL Server中的VARCHAR和NVARCHAR数据类型

它返回长度为17,因为每个字符1个字节,包括一个空格字符。

SQL Server中的VARCHAR和NVARCHAR数据类型

以下查询定义了没有任何N值的VARCHAR数据类型。因此,SQLServer 将默认值视为1个字节,如下所示。

SQL Server中的VARCHAR和NVARCHAR数据类型

我们还可以通过CAST或CONVERT函数使用VARCHAR。例如,在下面的两个示例中,我们声明了一个长度为100字节的变量,然后使用了CAST运算符。

第一个查询返回长度为30,因为我们没有在CAST运算符VARCHAR数据类型中指定N。默认长度为30。

SQL Server中的VARCHAR和NVARCHAR数据类型

但是,如果字符串长度小于30,则取字符串的实际大小。

SQL Server中的VARCHAR和NVARCHAR数据类型

SQL中的NVARCHAR[ ( n | max ) ]

所述NVARCHAR数据类型是用于Unicode的可变长度的字符数据类型。这里,N指的是国家语言字符集,用于定义Unicode字符串。您可以存储非Unicode和Unicode字符(日语汉字、韩文等)。

N表示以字节为单位的字符串大小。

它最多可以存储4000个Unicode和非Unicode字符。

VARCHAR数据类型每个字符占用2个字节。如果不为N指定任何值,则需要2个字节的存储空间。

以下查询使用100个字节的数据定义VARCHAR数据类型。

SQL Server中的VARCHAR和NVARCHAR数据类型

它返回36的字符串长度,因为NVARCHAR每个字符存储占用2个字节。

SQL Server中的VARCHAR和NVARCHAR数据类型

与VARCHAR数据类型类似,NVARCHAR也有1个字符(2个字节)的默认值,而没有为N指定显式值。

SQL Server中的VARCHAR和NVARCHAR数据类型

如果我们使用CAST或CONVERT函数应用NVARCHAR转换而没有任何显式N值,则默认值为30个字符,即60个字节。

SQL Server中的VARCHAR和NVARCHAR数据类型

以VARCHAR数据类型存储Unicode和非Unicode值

假设我们有一个表,记录来自电子购物门户的客户反馈。为此,我们有一个包含以下查询的SQL表。

SQL Server中的VARCHAR和NVARCHAR数据类型

我们在这个表中插入几个英语、日语和印地语的示例记录。[Comment]的数据类型是VARCHAR,[NewComment]是NVARCHAR()。

SQL Server中的VARCHAR和NVARCHAR数据类型

查询成功执行,并在从中选择一个值时给出以下行。对于第二和第三行,如果数据不是英语的,它就不能识别数据。

SQL Server中的VARCHAR和NVARCHAR数据类型

VARCHAR和NVARCHAR数据类型:性能比较

我们不应在JOIN或WHERE谓词中混合使用VARCHAR和NVARCHAR数据类型。它使现有索引无效,因为SQLServer 要求JOIN两侧的数据类型相同。如果不匹配,SQLServer 会尝试使用CONVERT_IMPLICIT()函数进行隐式转换。

SQLServer 使用数据类型优先级来确定目标数据类型。NVARCHAR的优先级高于VARCHAR数据类型。因此,在数据类型转换期间,SQLServer 会将现有的VARCHAR值转换为NVARCHAR。

SQL Server中的VARCHAR和NVARCHAR数据类型

现在,让我们执行两个SELECT语句,根据它们的数据类型检索记录。

SQL Server中的VARCHAR和NVARCHAR数据类型

这两个查询都使用索引查找运算符和我们之前定义的索引。

SQL Server中的VARCHAR和NVARCHAR数据类型

现在,我们切换数据类型值以与WHERE谓词进行比较。第1列具有VARCHAR数据类型,但我们指定NA将其作为NVARCHAR数据类型。

类似地,col2是NVARCHAR数据类型,我们指定了引用VARCHAR数据类型的值“C”。

SQL Server中的VARCHAR和NVARCHAR数据类型

在查询实际执行计划中,您得到一个索引扫描,SELECT语句有一个警告符号。

SQL Server中的VARCHAR和NVARCHAR数据类型

此查询工作正常,因为NVARCHAR()数据类型可以同时具有Unicode和非Unicode值。

现在,第二个查询使用索引扫描并在SELECT运算符上发出警告符号。

SQL Server中的VARCHAR和NVARCHAR数据类型

将鼠标悬停在发出有关隐式转换的警告的SELECT语句上。SQLServer 无法正确使用现有索引。这是由于VARCHAR和NVARCHAR数据类型的数据排序算法不同。

如果表有数百万行,SQLServer必须做额外的工作并使用隐式数据转换来转换数据。它可能会对您的查询性能产生负面影响。因此,在优化查询时应避免混合和匹配这些数据类型。

SQL Server中的VARCHAR和NVARCHAR数据类型

结论

您应该在适当地设计数据库表及其列数据类型时查看您的数据要求。通常,VARCHAR数据类型可以满足您的大部分数据需求。但是,如果需要在列中同时存储Unicode和非Unicode数据类型,则可以考虑使用NVARCHAR。但是,在做出最终决定之前,您应该查看其性能影响、存储大小。

审核编辑 :李倩

京云律所-东台站 京云律所-兴安站 京云律所-龙岩站 京云律所-原平站 京云律所-泉州站 京云律所-五常站 京云律所-冷水江站 京云律所-怀化站 京云律所-牡丹江站 京云律所-赣州站 京云律所-海东站 京云律所-深圳站 京云律所-黔西南布依族站 京云律所-唐山站 京云律所-海宁站 京云律所-辛集站 京云律所-临江站 京云律所-林芝站 京云律所-霍林郭勒站 京云律所-射洪站 京云律所-高碑店站 京云律所-阿坝站 京云律所-恩施站 京云律所-开原站 京云律所-阆中站 京云律所-临清站 京云律所-瑞昌站 京云律所-康定站 京云律所-平度站 京云律所-龙港站 京云律所-临沂站 京云律所-阿图什站 京云律所-宁德站 京云律所-柳州站 京云律所-宜城站 京云律所-邛崃站 京云律所-临夏站 京云律所-雷州站 京云律所-龙南站 京云律所-永安站 京云律所-安陆站 京云律所-孝义站 京云律所-石狮站 京云律所-乌兰察布站 京云律所-吉首站 京云律所-克孜勒苏站 京云律所-津市站 京云律所-文山壮族站 京云律所-台山站 京云律所-永城站 京云律所-新密站 京云律所-贵港站 京云律所-青州站 京云律所-乌苏站 京云律所-连云港站 京云律所-高邮站 京云律所-卫辉站 京云律所-绥化站 京云律所-扬州站 京云律所-营口站 京云律所-呼和浩特站 京云律所-清远站 京云律所-凤城站 京云律所-崇左站 京云律所-资兴站 京云律所-太仓站 京云律所-荆州站 京云律所-肥城站 京云律所-池州站 京云律所-鹰潭站 京云律所-晋城站 京云律所-随州站 京云律所-虎林站 京云律所-玉树站 京云律所-邯郸站 京云律所-广德站 京云律所-济南站 京云律所-长治站 京云律所-广安站 京云律所-武夷山站 京云律所-淄博站 京云律所-任丘站 京云律所-大同站 京云律所-丹江口站 京云律所-沙河站 京云律所-黄南站 京云律所-新泰站 京云律所-张家口站 京云律所-平果站 京云律所-绥芬河站 京云律所-利川站 京云律所-湘潭站 京云律所-错那站 京云律所-英德站 京云律所-敦化站 京云律所-武穴站 京云律所-驻马店站 京云律所-简阳站 京云律所-嫩江站 京云律所-湖州站

免责声明:文章内容来自互联网,本站仅提供信息存储空间服务,真实性请自行鉴别,本站不承担任何责任,如有侵权等情况,请与本站联系删除。

(0)
Iphostmonitor:“发送HTTP(S) 请求”简单操作的可能用途是什么?
上一篇 2023-04-16 03:43:12
特斯拉计划在上海建立超级储能站工厂
下一篇 2023-04-16 03:45:48

联系我们

在线咨询: QQ交谈

邮件:362039258#qq.com(把#换成@)

工作时间:周一至周五,10:30-16:30,节假日休息。