只是nvarchar支持多字节字符吗?如果是这样的话,除了存储问题之外,使用varchars还有什么意义吗?
- 我喜欢incomudro的观点,正是这一点让我首先深入探讨了varchar和nvarchar之间的区别。我们的Java应用程序针对SQL Server数据库使用MyBATIS,它默认地将字符串发送为NVARCHAR(仍然不确定如何(或如果)是可重写的)。一个简单的查询显示为一个巨大的性能问题,因为我将它选择的列定义为varchar,而不是nvarchar,它忽略了列上的索引。
- 此链接可帮助您codefari.com/2015/10/…
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存储。
- 这是很好的信息。因此,如果我推断选择最终成为——哪种资源更便宜:处理器+开发开销或存储,我是否正确地理解了这一点?
- @Matthewpatrickcashatt-你可以这样看。但是,如果你想象一个美好的世界,所有的文本数据都是Unicode的,开发人员根本不需要考虑什么是编码的东西,而一整类的错误根本就不会发生,那么你就会发现实际上根本没有选择。
- varchar不限于所有排序规则中的8位代码页
- @Martin Smith——在这些情况下,varchar赋予(紧凑存储)的微小优势消失了。我想瓦查尔比我想象的还要糟!
- @Jeffreylwhitledge:评论1:您认为您的答案仍然适用于数据仓库吗?本页文件建议使用"Only use nchar and nvarchar when the universe of values spans or will span multiple languages."。出于数据仓库的目的,磁盘I/O和网络带宽是否也应该考虑?
- @Jeffreylwhitledge:评论2:如果您考虑(链接)"With 1 billion rows, every wasted byte per row costs you 1GB, which you also have to backup, recover, and index.",您是否仍然认为代码页不兼容性是数据类型选择/选择的决定因素?
- @ivaluevalue——所以他们提倡将代码页作为数据压缩的一种手段?如果我要压缩数据,我希望这样做的方式不会损害数据的完整性。有很多方法可以在不损坏字符数据的情况下做到这一点,因为在代码页转换中会损坏字符数据。UTF-8将是一个良好的开端。
- @ivaluevalue——此外,数据仓库设计通常不会为偶尔出现的1GB"浪费"而苦恼。一个典型的星型模式被设计为通过数据去规格化来浪费大量的空间。我不喜欢这种方案,因为它们是对完美的RDBMS系统的滥用。但是,假设这样做是一个好主意,一旦您决定放弃为数据仓库设计好的关系数据库,拥有大量未压缩的数据就不再是一个需要担心的问题。
- 请注意,一旦您决定将数据"存储为Unicode",仍然有一个问题,最佳的Unicode表示是什么。nvarchar字符串通常是有效的utf-16,因此它相对于utf-8的主要优势在于它更容易与使用utf-16的其他组件交互(例如,Windows系统调用或16位排序规则)。它不是"真正的unicode",也不是比utf-8"真正的unicode"更多或更少,尽管它仍然优于ascii。除了压缩英文文本外,utf-8的优势与utf-16相同:与其他utf-8组件的交互…
- "nvarchar列可以存储任何Unicode数据。"这不是真的,尽管从大多数MSSQL文档中很容易获得这种印象。内部使用的编码是ucs-2,它只能在Unicode的"基本多语言平面"中存储数据。此平面外的字符不能直接存储在NChar或nvarchar字段中,而不进行其他处理。
- @Peterallenweb—您可以"存储"任何Unicode数据,因为UTF-16中的代理项对可以像字符一样存储在UCS-2中。这对于数据存储和检索将是透明的。现在,您不能做的是在BMP之外获得可靠的案例转换和比较,但我没有对此做出任何声明。因此,如果您有许多要在其上进行处理的Desseret文本,最好在数据库外部进行处理。但是把它放在那里就行了。(当然,瓦查尔也不会帮你的!)
- ascii(字符)和ascii(字符串)有什么区别??.sql将所有值处理为varbinary或binary????
- 我看到的与此完全相反的是表演。读取2K nvarchars比读取2K varchars慢三分之一。我正在使用一个SSD来最小化I/O。所以转换比I/O快得多,这在我看来是有意义的,因为转换不依赖于I/O,而且I/O在所有这一切中始终是最慢的部分。
- @波巴兹森-这对我来说是正确的。显然,读取400000字节将比读取200000字节花费更长的时间。nvarchar版本不需要花费两倍的时间,这一事实可以部分解释为进行代码页转换所需的额外时间。不过,我的论点不是Unicode更快。我的论点是这是正确的。对我来说,每次都是正确的。
- 在我工作的地方,我们有12000个数据库,每个数据库有数百万行。这些数据库只在美国和英国运行。把你所说的那种钱花在储存上,以换取一些不存在的"正确性",这是荒谬的。我们从来没有"错误"过。
- @prman-你没有说你的数据库存储了什么类型的数据,但是如果其中包括人名或地名,那么很简单的一个事实就是没有一个(非Unicode)代码页覆盖数据正确所需的所有字符。这是真的,即使是对美国或英国。当你说你从来没有错误的时候,我想知道你是怎么知道的。你是说系统从来没有因为编码错误而停机吗?我会接受的。你是说从来没有人抱怨系统弄错了他们的名字吗?我也会接受的。
- (继续)你是说没有人放弃了正确地输入他们的名字,只是接受了发生的损坏?这可能不会发生。但如果有,你就没有办法知道。我认为您可能不知道数据库中出现了什么错误。机器一直在嗡嗡叫,所以数据很好。我敢打赌,你在白炽灯的照射下看报纸,一切都很好。
- 你能给我们举些杰弗里的例子吗?在我的世界范围内(斯堪的纳维亚),最大的问题通常是选择正确的排序规则(以正确的顺序获取&230;/&228;、&248;/&246;、&229)。varchar可以存储我们的特殊字符(尽管是两个字节)。由于~90-95%的字符通常是纯ASCII字符,如果我们使用nvarchar,则转换为存储零的近50%字符字段。在我工作的地方,我们确实切换到了nvarchar,我们的硬件人员的第一个问题是,"为什么DBS现在是正常大小的两倍?"我怀疑我们的行动是一个错误,我很想学别的。
- 只是为了回答我自己的意见:我选择的排序规则不支持UTF-8。我习惯使用DBMS(SQL Anywhere),它使用UTF-8,当涉及nvarchar和varchar时,自然会触发不同的策略。这样:女权女为我。
- 我是否正确地认为,作为一般规则,nvarchar应该用于数据,在索引时使用varchar和char作为创建关系,因为它们可能提供额外的性能,从而产生巨大的差异?
- @JWrightmail通过选择一个字符集或另一个字符集对这些类型的应用程序的性能可能会有轻微的影响,并且改进(但不确定)也可能有利于varchar字符集。但我还是不愿意。主要是因为(如这个答案所示),我似乎对Unicode有宗教信仰,并且自动认为所有非Unicode字符集都是邪恶的。如果你不与我分享我的信仰,那么其他的选择是可行的,但我可能会暗地里对你进行评判。对不起的。
varchar:可变长度的非Unicode字符数据。"这determines collation数据库的代码页的数据仓库使用冰。
nvarchar:可变长度数据的Unicode字符。collation依赖在数据库进行比较。
军事和这一知识,使用whichever配合你的输入数据(ASCII V。Unicode的)。
- 是否存在varchar无法存储unicode数据之类的限制?都是1和0。我可以将中文内容保存为varchar,这对我的数据库很好。不过,我只是指定了它的UTF-8。那怎么办?
- @Nishant最新的答案:当然,您可以在varchar中存储utf-8,但它会破坏SQL Server字符串函数。如果您在应用程序中执行所有搜索/转换,那么是的,您可以这样做(但是有什么好处?).ss支持的唯一Unicode编码是ucs-2(是的,不是ss2k16之前的utf-16),其字符串函数仅使用该编码。顺便问一下,指数呢?如果您想存储任意数据,最好使用二进制。
- 是的,它只是破坏了字符串搜索功能。
- 所以,你知道…它不"起作用"。这就像把一个float存储到一个int中,然后继续说,"很确定小数会丢失。"只是不要这样做。
永远使用nvarchar AA。它允许在两个漂亮的建筑0.8米。在把任何数据信息。我是华侨城的CMS系统的事故,因为使用nvarchar。这些天,任何新的应用不应该真的是有关金额与所需的空间。
- 新应用不应该关注空间限制的想法有些短视,任何处理过中大型企业级数据库的人都会乐于告诉你,完全不正确。
- 为了自由地在Tags2K的嘴里说上几句话,我认为一个更准确的说法可能是"任何新的应用程序都越来越不可能比它们更关注国际化和其他字符集问题更关注所需的空间"。
- "现在,任何新的应用程序都不应该真正关心所需的空间量。"—除非您使用的是免费云存储,在免费云存储中,付费计划大大增加了$(请参阅AppHarbor SQL Server共享计划)。
- "甘德斯嚎叫!你就在那里。一般化的说法充其量只是暂时正确的。计算绝对是一个摇摆和迂回的游戏。我非常关心我在WindowsAzureCCP上使用了多少空间。也就是说我"永远"不会在nvarchar上使用varchar。噢,我刚才自相矛盾了吗?
- @Rism,我相信你消除了任何与你使用"never"报价相矛盾的风险,至少在技术上是这样。
这取决于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!它避免了限制和依赖性,对存储空间很好,而且通常对性能也是最好的。
- 这是一个非常好的答案,除了关于SQL Server的问题。
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格式。
- 但是,如果您正确地编写了代码(即使用参数化查询等),那么第1点的风险就更小了。
主要是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相比,当所有相关系统和数据库本身的所有排序都相同时…?如果不是这样的话,那么就必须进行排序转换,这使得VARCHAR和NVARCHAR一样可行。
除此之外,一些数据库系统,如SQL Server(2012年之前)的页面大小约为8K。因此,如果您要存储的可搜索数据不包含在像TEXT或NTEXT字段中,那么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)的主要区别是:
varchar(可变长度,非Unicode字符数据)大小高达8000。1.它是可变长度的数据类型
用于存储非Unicode字符
每个字符占用1字节的空间
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关键字,而不是=。