关于sql server:varchar和nvarchar有什么区别?

What is the difference between varchar and nvarchar?

只是nvarchar支持多字节字符吗?如果是这样的话,除了存储问题之外,使用varchars还有什么意义吗?


nvarchar大柱可以是任何Unicode数据。A柱varchar冰的限制两个8位codepage。一些人认为应该用varcharIP,因为它需要较少的空间。我相信这是不是正确的答案。codepage incompatabilities是一个痛苦,冰和Unicode codepage治愈的问题。廉价磁盘和内存与活动,有真的没有理由浪费时间在两个装碴与页面的代码了。

所有的现代操作系统和开发平台internally使用Unicode。城市用nvarchar而不是varchar,你可以避免做编码conversions从每一次你读或写的数据库。conversions个小时,两个易卒中型鸭是错误的。转换和回收从错误的是一个非平凡的问题。

如果你在接口和应用,辨别只读ASCII码,我还recommend使用Unicode的数据库。我们的算法和数据库collation会工作的更好的Unicode。avoids Unicode转换问题,当与其他系统的接口。你会准备未来。你可以永远和你的数据验证,冰的限制两个7位ASCII为什么你的遗留系统具有保持平衡,当一些人享受的好处全Unicode存储。


varchar:可变长度的非Unicode字符数据。"这determines collation数据库的代码页的数据仓库使用冰。

nvarchar:可变长度数据的Unicode字符。collation依赖在数据库进行比较。

军事和这一知识,使用whichever配合你的输入数据(ASCII V。Unicode的)。


永远使用nvarchar AA。它允许在两个漂亮的建筑0.8米。在把任何数据信息。我是华侨城的CMS系统的事故,因为使用nvarchar。这些天,任何新的应用不应该真的是有关金额与所需的空间。


这取决于Oracle的安装方式。在安装过程中,将设置nls_characterset选项。您可以通过查询SELECT value$ FROM sys.props$ WHERE name = 'NLS_CHARACTERSET'找到它。

如果您的nls_字符集是像utf8这样的Unicode编码,那就太好了。使用varchar和nvarchar几乎完全相同。别再看了,去读吧。否则,或者如果您无法控制Oracle字符集,请继续阅读。

varchar-数据存储在nls_字符集编码中。如果同一服务器上有其他数据库实例,则可能会受到这些实例的限制;反之亦然,因为必须共享设置。这样的字段可以存储任何可以使用该字符集进行编码的数据,而不存储其他数据。例如,如果字符集是MS-1252,则只能存储英文字母、少量重音字母和其他一些字符(如欧元和-)。您的应用程序只对少数几个地区有用,不能在世界其他地方运行。因此,这被认为是一个坏主意。

nvarchar-数据以Unicode编码存储。支持每种语言。好主意。

存储空间怎么样?varchar通常是有效的,因为字符集/编码是为特定的区域设置定制的。nvarchar字段以utf-8或utf-16编码存储,具有讽刺意味的是,基于nls设置。UTF-8对于"西方"语言非常有效,但仍然支持亚洲语言。UTF-16对于亚洲语言非常有效,但仍然支持"西方"语言。如果关心存储空间,请选择一个NLS设置,以使Oracle酌情使用UTF-8或UTF-16。

处理速度如何?大多数新的编码平台使用UNICODE(Java,.NET,甚至C++ STD::WSCOPE从几年前开始!)因此,如果数据库字段是varchar,它将强制Oracle在每次读或写时在字符集之间进行转换,这不是很好。使用nvarchar可以避免转换。

底线:使用nvarchar!它避免了限制和依赖性,对存储空间很好,而且通常对性能也是最好的。


nvarchar数据存储为Unicode,所以,如果你再持续两个多语种数据(超过一个语言)在一个你需要的数据列的n个变量。


我的两分钱

  • 如果不使用正确的数据类型,索引可能会失败:在SQL Server中:当您在varchar列上有一个索引并将其显示为Unicode字符串时,SQL Server不会使用该索引。当向包含smallint的索引列提供bigint时,也会发生同样的事情。即使bigint小到可以成为smallint,SQL Server也无法使用索引。另一方面,您没有这个问题(当为索引bigint或nvarchar列提供smallint或ansi代码时)。

  • 不同DBMS(数据库管理系统)的数据类型可能不同:要知道,每个数据库的数据类型都略有不同,varchar并不意味着所有地方都相同。虽然SQL Server有varchar和nvarchar,但Apache/Derby数据库只有varchar,varchar是Unicode格式。


  • 主要是nvarchar存储Unicode字符,varchar存储非Unicode字符。

    "unicodes"是指16位字符编码方案,允许将来自许多其他语言(如阿拉伯语、希伯来语、汉语、日语)的字符编码到单个字符集中。

    这意味着每个字符使用2个字节进行存储,而非每个字符仅使用一个字节进行存储。这意味着与非单播相比,单播需要双倍的存储容量。


    我说的,它取决于。

    如果你开发一个桌面应用程序,在我们的工厂在Unicode(像所有当前Windows系统)和语言本身不支持Unicode(默认是Unicode字符串,在Java或C类#),然后去nvarchar。

    如果你开发的Web应用,在狗屋。为UTF-8和语言是PHP,这还不支持Unicode本机(版本5.x varchar),然后将可能是一个更好的选择。


    你是对的。nvarchar存储Unicode数据存储在varchar单字节的字符数据。比其他存储的差异(nvarcharrequires两次的存储空间为varchar),这已经是上述的主要原因为preferring nvarchar国际化将是在varchar(即储存。在其他的语言)。


    如果使用单个字节存储字符,则有256种可能的组合,因此可以保存256个不同的字符。排序规则是一种模式,用于定义字符及其比较和排序规则。

    1252是拉丁语(ansi),是最常见的。单字节字符集也不足以存储许多语言使用的所有字符。例如,一些亚洲语言有数千个字符,因此每个字符必须使用两个字节。

    Unicode标准

    当网络中使用多个代码页的系统时,就很难管理通信。为了使事情标准化,ISO和Unicode联盟引入了Unicode。Unicode使用两个字节来存储每个字符。也就是说,可以定义65536个不同的字符,所以几乎所有的字符都可以用Unicode覆盖。如果两台计算机使用Unicode,则每个符号都将以相同的方式表示,不需要转换—这是Unicode背后的想法。

    SQL Server有两类字符数据类型:

    • 非Unicode(字符、varchar和文本)
    • Unicode(nchar、nvarchar和ntext)

    如果需要保存来自多个国家的字符数据,请始终使用Unicode。


    nvarchar会帮助你两个大的Unicode字符。它的路要走,如果你想大定域数据。


    虽然NVARCHAR存储unicode,但在整理的帮助下,您应该考虑使用VARCHAR并保存您的本地语言数据。

    想象一下下面的场景。

    数据库的排序规则是波斯语的,您保存的值是'???(阿里的波斯文字)在VARCHAR(10)数据类型中。没有问题,DBMS只使用三个字节来存储它。

    但是,如果要将数据传输到另一个数据库并查看正确的结果,则目标数据库必须与本例中的目标(波斯语)具有相同的排序规则。

    如果目标排序规则不同,则会看到一些问号(?)在目标数据库中。

    最后,请记住,如果您使用的是大型数据库(用于本地语言),我建议您使用location,而不是使用太多的空格。

    我相信设计会有所不同。这取决于你工作的环境。


    遵循SQL Server varchar和nvarchar数据类型之间的差异。在这里你可以看到一个非常描述性的方式。

    在generalnvarchar中,数据存储为unicode,因此,如果要在数据列中存储多语言数据(多语言),则需要n变量。


    我必须在这里说(我意识到我可能会敞开心扉接受采访!)当然,只有当NVARCHAR实际上更有用时(注意这里有更多!)与VARCHAR相比,当所有相关系统和数据库本身的所有排序都相同时…?如果不是这样的话,那么就必须进行排序转换,这使得VARCHARNVARCHAR一样可行。

    除此之外,一些数据库系统,如SQL Server(2012年之前)的页面大小约为8K。因此,如果您要存储的可搜索数据不包含在像TEXTNTEXT字段中,那么VARCHAR提供了8K的全部空间,而NVARCHAR只提供4K(两倍字节,两倍SPA)CE)。

    我想,概括地说,两者的使用取决于:

    • 项目或上下文
    • 基础设施
    • 数据库系统

    我看了一下答案,许多人似乎建议使用nvarchar而不是varchar,因为空间不再是问题,所以启用unicode以获得很少的额外存储不会有任何危害。当你想在你的列上应用一个索引时,这并不总是正确的。对于可以索引的字段大小,SQL Server限制为900字节。所以如果你有一个varchar(900),你仍然可以索引它,但不能索引varchar(901)。使用nvarchar时,字符数减半,因此可以索引到nvarchar(450)。因此,如果您确信不需要nvarchar,我不建议您使用它。

    一般来说,在数据库中,我建议您坚持您需要的大小,因为您总是可以扩展。例如,一位同事曾经认为使用nvarchar(max)作为一个列没有任何危害,因为我们对存储完全没有问题。稍后,当我们尝试对此列应用索引时,SQL Server拒绝了这一点。然而,如果他从甚至是varchar(5)开始,我们以后就可以简单地把它扩展到我们需要的范围,而不需要这样一个问题,那就需要我们做一个实地迁移计划来解决这个问题。


    Varchar(n)nvarchar(n)的主要区别是:enter image description here

    varchar(可变长度,非Unicode字符数据)大小高达8000。1.它是可变长度的数据类型

  • 用于存储非Unicode字符

  • 每个字符占用1字节的空间

  • enter image description here

    nvarchar:长度可变的Unicode字符数据。

    1.它是可变长度的数据类型

    2.用于存储Unicode字符。

  • 数据以Unicode编码存储。每个支持语言。(例如阿拉伯语、德语、印地语等)

  • Jeffrey L Whitledge的声誉评分约为47000,建议使用nvarchar。

    所罗门·鲁茨基(Solomon Rutzky)的声誉评分为~33200,建议:不要总是使用nvarchar。这是一种非常危险的态度/方法,而且往往代价高昂。

    varchar和nvarchar SQL Server数据类型之间的主要性能差异是什么?

    https://www.sqlservercentral.com/articles/disk-is-price-orly-4

    这两个人的声望都这么高,一个学习SQL Server数据库的开发人员会选择什么呢?

    如果您的选择不一致,答案和评论中会有许多关于性能问题的警告。

    对性能有pro/con nvarchar注释。

    性能有pro/con varchar注释。

    对于一个有数百列的表,我有一个特殊的要求,这本身可能是不寻常的?

    我选择varchar是为了避免接近SQL*Server2012的8060字节表记录大小限制。

    对我来说,nvarchar的使用超过了8060字节的限制。

    我还认为应该将相关代码表的数据类型与主中心表的数据类型相匹配。

    我在这个工作的地方看到了varchar列的使用,南澳大利亚政府,以前经验丰富的数据库开发人员,表的行数将达到数百万或更多(以及非常少的nvarchar列,如果有的话,在这些非常大的表中),所以预期的数据行数可能成为这个决定的一部分。


    varchar相比,nvarchar是安全使用的,因为nvarchar也允许使用Unicode字符,因此可以使我们的代码无错误(类型不匹配)。在SQL Server查询中使用where条件时,如果使用=操作符,有时会抛出错误。这可能是因为我们的映射列将在varchar中被修改。如果我们在nvarchar中定义它,这个问题就不会发生。不过,我们还是坚持使用varchar,避免这个问题,最好使用LIKE关键字,而不是=