0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SQL Server中的VARCHAR和NVARCHAR数据类型

哲想软件 ? 来源:哲想软件 ? 2023-04-10 09:57 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

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

SQL中的VARCHAR[ ( n | max ) ]

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

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

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

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

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

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

58c648ce-d73a-11ed-bfe3-dac502259ad0.png

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

58dda06e-d73a-11ed-bfe3-dac502259ad0.png

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

59083acc-d73a-11ed-bfe3-dac502259ad0.png

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

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

5928caee-d73a-11ed-bfe3-dac502259ad0.png

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

594d2704-d73a-11ed-bfe3-dac502259ad0.png

SQL中的NVARCHAR[ ( n | max ) ]

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

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

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

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

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

596eeb64-d73a-11ed-bfe3-dac502259ad0.png

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

59874df8-d73a-11ed-bfe3-dac502259ad0.png

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

59b0ed20-d73a-11ed-bfe3-dac502259ad0.png

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

59d50142-d73a-11ed-bfe3-dac502259ad0.png

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

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

59fbf180-d73a-11ed-bfe3-dac502259ad0.png

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

5a158a1e-d73a-11ed-bfe3-dac502259ad0.png

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

5a3443f0-d73a-11ed-bfe3-dac502259ad0.png

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

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

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

5a5a8498-d73a-11ed-bfe3-dac502259ad0.png

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

5a74aae4-d73a-11ed-bfe3-dac502259ad0.png

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

5a8d0472-d73a-11ed-bfe3-dac502259ad0.png

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

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

5aba63fe-d73a-11ed-bfe3-dac502259ad0.png

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

5acedb86-d73a-11ed-bfe3-dac502259ad0.png

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

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

5af21b82-d73a-11ed-bfe3-dac502259ad0.png

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

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

5b125dca-d73a-11ed-bfe3-dac502259ad0.png

结论

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

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据库
    +关注

    关注

    7

    文章

    3941

    浏览量

    66634
  • 函数
    +关注

    关注

    3

    文章

    4385

    浏览量

    65161
  • 数据类型
    +关注

    关注

    0

    文章

    237

    浏览量

    13917

原文标题:SQL Server 中的VARCHAR和NVARCHAR数据类型

文章出处:【微信号:哲想软件,微信公众号:哲想软件】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    数据数据恢复—SQL Server数据库被加密如何恢复数据

    SQL Server数据库故障: SQL Server数据库被加密,无法使用。
    的头像 发表于 06-25 13:54 ?198次阅读
    <b class='flag-5'>数据</b>库<b class='flag-5'>数据</b>恢复—<b class='flag-5'>SQL</b> <b class='flag-5'>Server</b><b class='flag-5'>数据</b>库被加密如何恢复<b class='flag-5'>数据</b>?

    IEC101协议可以传输什么类型数据

    IEC101协议作为电力系统远动通信的核心标准,其核心能力在于支持多种类型数据的传输,满足调度端与场站端(如变电站、发电厂)的实时监控、控制及状态感知需求。以下从数据类型、传输模式及典型应用场景三个
    的头像 发表于 05-21 11:37 ?287次阅读

    #### KEPServerEX 数据存储插件\\-2

    ,同类型的/同设备的参数可以设置成一样的,这样存储到数据库之后,能够更方便的在数据库中进行检索。 默认“数据项ID”是整形数据,如需填写字符
    发表于 04-09 16:09

    数据数据恢复—SQL Server附加数据库提示“错误 823”的数据恢复案例

    SQL Server数据库附加数据库过程中比较常见的报错是“错误 823”,附加数据库失败。 如果数据
    的头像 发表于 02-28 11:38 ?519次阅读
    <b class='flag-5'>数据</b>库<b class='flag-5'>数据</b>恢复—<b class='flag-5'>SQL</b> <b class='flag-5'>Server</b>附加<b class='flag-5'>数据</b>库提示“错误 823”的<b class='flag-5'>数据</b>恢复案例

    labview数据类型与PLC 数据类型之间的转换(来自于写入浮点数到汇川 PLC数据转换关键的修改)

    为32位无符号整型U32 2、将U32拆分为两个U16,分高低位写入PLC 3、在PLC,将低位寄存器设置为浮点数数据类型 4、结果:PLC中一直无法正确转换。 原因及解决方法: 1、labview
    发表于 02-24 19:01

    Devart: dbForge Compare Bundle for SQL Server—比较SQL数据库最简单、最准确的方法

    ? dbForge Compare Bundle For SQL Server:包含两个工具,可帮助您节省用于手动数据库比较的 70% 的时间 dbForge数据比较 帮助检测和分析实
    的头像 发表于 01-17 11:35 ?597次阅读

    dbForge Studio For SQL Server:用于有效开发的最佳SQL Server集成开发环境

    dbForge Studio For SQL Server:用于有效开发的最佳SQL Server集成开发环境 SQL编码助手
    的头像 发表于 01-16 10:36 ?795次阅读

    字符串在数据的存储方式

    数据库是现代信息技术存储和管理数据的核心组件。字符串作为最常见的数据类型之一,在数据的存储
    的头像 发表于 01-07 15:41 ?899次阅读

    请问ADS1299使用Test Signals ,获取到的数据类型是什么?

    请问ADS1299使用Test Signals ,获取到的数据类型是什么?使用什么公式可以还原?据了解,外部信号转换完成后是浮点型的,但是没有看到这块的说明。
    发表于 01-06 07:14

    西门子博途新数据类型之:SINT(8位整数)

    数据类型 SINT (Short INT) 的操作数长度为 8 位,由以下两部分组成:一部分是符号,另一部分是数值。位 0 到 6 的信号状态表示数值。位 7 的信号状态表示符号。符号可以是“0”(正信号状态),或“1”(负信号状态)。
    的头像 发表于 11-09 09:52 ?4840次阅读
    西门子博途新<b class='flag-5'>数据类型</b>之:SINT(8位整数)

    AIC23采集到的数据是应该用什么数据类型来接收?int还是unsigned int?

    AIC23采集到的数据是应该用什么数据类型来接收,int还是unsigned int? 这个采集到的数字是什么含义呢?代表的是声音信号的幅值? while(!MCBSP_rrdy(hMcbsp
    发表于 10-18 06:56

    数据数据恢复—SQL Server数据库出现823错误的数据恢复案例

    SQL Server数据库故障: SQL Server附加数据库出现错误823,附加
    的头像 发表于 09-20 11:46 ?729次阅读
    <b class='flag-5'>数据</b>库<b class='flag-5'>数据</b>恢复—<b class='flag-5'>SQL</b> <b class='flag-5'>Server</b><b class='flag-5'>数据</b>库出现823错误的<b class='flag-5'>数据</b>恢复案例

    labview数据类型的取值范围是多少

    LabVIEW的数据类型丰富多样,涵盖了整数、小数(浮点数)、复数等多种类型,每种类型都有其特定的取值范围。以下是对LabVIEW中常见数据类型取值范围的说明: 整数
    的头像 发表于 09-04 17:33 ?2727次阅读

    常见的遥感数据类型有哪些

    遥感技术是一种通过遥感器在远离目标的位置获取目标地物的电磁波信息,并进行分析的技术。遥感数据类型繁多,涵盖了从可见光到红外、微波等多个波段,以及不同的数据格式和分辨率。 光学遥感数据 : 全色影像
    的头像 发表于 09-04 14:30 ?3774次阅读

    干货分享 如何采集OPC DA数据并存储到SQL Server数据库?

    在工业自动化系统,将OPC DA数据采集并存储到SQL Server数据库具有显著的应用价值。本文手把手教您完成这一操作,实现
    的头像 发表于 08-09 10:46 ?1260次阅读
    干货分享  如何采集OPC DA<b class='flag-5'>数据</b>并存储到<b class='flag-5'>SQL</b> <b class='flag-5'>Server</b><b class='flag-5'>数据</b>库?